这个问题的灵感来自
我看到这些结构
for file in `find . -type f -name ...`; do smth with ${file}; done
Run Code Online (Sandbox Code Playgroud)
和
for dir in $(find . -type d -name ...); do smth with ${dir}; done
Run Code Online (Sandbox Code Playgroud)
几乎每天都在这里使用,即使有些人花时间对这些帖子发表评论,解释为什么应该避免这种东西......
看到此类帖子的数量(以及有时这些评论被简单地忽略的事实)我想我还不如问一个问题:
为什么循环find
的输出是不好的做法,为 返回的每个文件名/路径运行一个或多个命令的正确方法是find
什么?
我在尝试着:
0 0 0
到文件的第一行。2*pi
或6.2832
乘以三列文件的第一列,其格式类似于下面,但前提是该行以数字开头。第二列和第三列保持原样。*
如果行不以数字开头,则在行首附加a(除非它已经是 ) *
。即只是注释掉当前行,除非它已经被注释掉了。这是一个示例输入文件:
* radius, section, index
1.12 A 0
2.0 A 1
* There is white space before this comment
* This is a comment indicating a new section
5 B 0
3.17 B 1
7.3 B 7
This row starts with an alphabet char and should be commented out by the script.
0 C 1
1 C 2
Run Code Online (Sandbox Code Playgroud)
这是预期的输出:
0 0 0
* radius, …
Run Code Online (Sandbox Code Playgroud) 我有以下 JPEG 文件:
$ ls -l
-rw-r--r-- 1 user group 384065 janv. 21 12:10 CamScanner 01-10-2022 14.54.jpg
-rw-r--r-- 1 user group 200892 janv. 10 14:55 CamScanner 01-10-2022 14.55.jpg
-rw-r--r-- 1 user group 283821 janv. 21 12:10 CamScanner 01-10-2022 14.56.jpg
Run Code Online (Sandbox Code Playgroud)
我用来$ img2pdf
将每个图像转换为 PDF 文件。要做到这一点 :
$ find . -type f -name "*.jpg" -exec img2pdf "{}" --output $(basename {} .jpg).pdf \;
Run Code Online (Sandbox Code Playgroud)
结果 :
$ ls -l *.pdf
-rw-r--r-- 1 user group 385060 janv. 21 13:06 CamScanner 01-10-2022 14.54.jpg.pdf
-rw-r--r-- 1 …
Run Code Online (Sandbox Code Playgroud) 我从https://unix.stackexchange.com/a/175845/674读取命令
为什么可以
$ bash -c 'for f do echo "$f";done' bash a b c
a
b
c
Run Code Online (Sandbox Code Playgroud)
输出与
$ bash -c 'for f in "$@"; do echo "$f";done' bash a b c
a
b
c
Run Code Online (Sandbox Code Playgroud)
?
为什么 for 循环不需要明确指定
循环变量的值集,如in "$@"
和
;
?
谢谢。