从`find`循环文件名?

时间:2012-02-22 07:55:43

标签: linux shell loops find

如果我运行此命令:

sudo find . -name *.mp3

然后我可以获得许多mp3文件的列表。

现在我想在循环中对每个mp3文件做一些事情。例如,我可以创建一个while循环,并在内部将第一个文件名分配给变量file。然后我可以用那个文件做点什么。接下来,我可以将第二个文件名分配给变量file并使用它等等。

如何使用linux shell命令实现这一点?任何帮助表示赞赏,谢谢!

4 个答案:

答案 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 Loop

正如其他人所指出的,你可以经常使用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