Linux 从“find”循环文件名?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/9391003/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Loop over file names from `find`?
提问by Searene
If I run this command:
如果我运行这个命令:
sudo find . -name *.mp3
then I can get a listing of lots of mp3 files.
然后我可以得到很多 mp3 文件的列表。
Now I want to do something with each mp3 file in a loop. For example, I could create a while
loop, and inside assign the first file name to the variable file
. Then I could do something with that file. Next I could assign the second file name to the variable file
and do with that, etc.
现在我想对循环中的每个 mp3 文件做一些事情。例如,我可以创建一个while
循环,并在内部将第一个文件名分配给变量file
. 然后我可以对那个文件做一些事情。接下来,我可以将第二个文件名分配给变量file
并使用它,等等。
How can I realize this using a linux shell command? Any help is appreciated, thanks!
如何使用 linux shell 命令实现这一点?任何帮助表示赞赏,谢谢!
采纳答案by Jeremy Kerr
For this, use the read
builtin:
为此,请使用read
内置:
sudo find . -name *.mp3 |
while read filename
do
echo "$filename" # ... or any other command using $filename
done
Provided that your filenames don't use the newline (\n
) character, this should work fine.
如果您的文件名不使用换行符 ( \n
) 字符,这应该可以正常工作。
回答by Some programmer dude
How about using the -exec
option to find?
使用-exec
选项查找怎么样?
find . -name '*.mp3' -exec mpg123 '{}' \;
That will call the command mpg123
for every file found, i.e. it will play all the files, in the order they are found.
这将为mpg123
找到的每个文件调用该命令,即它将按照找到的顺序播放所有文件。
回答by Mallik
for file in $(sudo find . -name *.mp3);
do
# do something with file
done
回答by sehe
My favourites are
我最喜欢的是
find . -name '*.mp3' -exec cmd {} \;
or
或者
find . -name '*.mp3' -print0 | xargs -0 cmd
While Loop
While 循环
As others have pointed out, you can frequently use a while read
loop to read filenames line by line, it has the drawback of not allowing line-ends in filenames (who uses that?).
正如其他人指出的那样,您可以经常使用while read
循环逐行读取文件名,它的缺点是不允许文件名中有行结尾(谁使用它?)。
xargs
vs. -exec cmd {} +
xargs
对比 -exec cmd {} +
Summarizing the comments saying that -exec
...+
is better, I prefer xargs because it is more versatile:
总结评论说-exec
...+
更好,我更喜欢 xargs 因为它更通用:
- works with other commands than just
find
- allows 'batching' (grouping) in command lines, say
xargs -n 10
(ten at a time) - allows parallellizing, say
xargs -P4
(max 4 concurrent processes running at a time) does privilige separation (such as in the OP's case, where he uses
sudo find
: using-exec
would run all commands as the root user, whereas withxargs
that isn't necessary:sudo find -name '*.mp3' -print0 | sudo xargs -0 require_root.sh sudo find -name '*.mp3' -print0 | xargs -0 nonroot.sh
in general, pipes are just more versatile (logging, sorting, remoting, caching, checking, parallelizing etc, you can do that)
- 与其他命令一起使用,而不仅仅是
find
- 允许在命令行中进行“批处理”(分组),例如
xargs -n 10
(一次十个) - 允许并行化,比如说
xargs -P4
(一次最多运行 4 个并发进程) 是否进行特权分离(例如在 OP 的情况下,他使用
sudo find
: using-exec
将以 root 用户身份运行所有命令,而xargs
没有必要这样做:sudo find -name '*.mp3' -print0 | sudo xargs -0 require_root.sh sudo find -name '*.mp3' -print0 | xargs -0 nonroot.sh
一般来说,管道只是更通用(日志记录、排序、远程处理、缓存、检查、并行化等,你可以这样做)