如果我运行此命令:
sudo find . -name *.mp3
然后我可以获得许多mp3文件的列表。
现在我想在循环中对每个mp3文件做一些事情。例如,我可以创建一个while
循环,并在内部将第一个文件名分配给变量file
。然后我可以用那个文件做点什么。接下来,我可以将第二个文件名分配给变量file
并使用它等等。
如何使用linux shell命令实现这一点?任何帮助表示赞赏,谢谢!
答案 0 :(得分:16)
为此,请使用read
内置:
sudo find . -name *.mp3 |
while read filename
do
echo "$filename" # ... or any other command using $filename
done
如果您的文件名不使用换行符(\n
),这应该可以正常使用。
答案 1 :(得分:10)
我最喜欢的是
find . -name '*.mp3' -exec cmd {} \;
或
find . -name '*.mp3' -print0 | xargs -0 cmd
正如其他人所指出的,你可以经常使用while read
循环逐行读取文件名,它的缺点是不允许文件名中的行尾(谁使用它?)。
xargs
与-exec cmd {} +
总结评论说-exec
... +
更好,我更喜欢xargs,因为它更通用:
find
xargs -n 10
(一次十个)xargs -P4
(一次最多运行4个并发进程)确实是分离(例如在OP的情况下,他使用sudo find
:使用-exec
将以root用户身份运行所有命令,而使用xargs
没必要:
sudo find -name '*.mp3' -print0 | sudo xargs -0 require_root.sh
sudo find -name '*.mp3' -print0 | xargs -0 nonroot.sh
一般来说,管道更通用(记录,排序,远程处理,缓存,检查,并行化等等,你可以这样做)
答案 2 :(得分:1)
如何使用-exec
选项查找?
find . -name '*.mp3' -exec mpg123 '{}' \;
这将为找到的每个文件调用命令mpg123
,即它将按照找到的顺序播放所有文件。
答案 3 :(得分:-3)
for file in $(sudo find . -name *.mp3);
do
# do something with file
done