我有以下脚本 - 它应该使用 find 循环文件名,但它似乎用空格将文件名分开了?我需要文件名保持完整
#!/bin/bash
for file in `find -name "*.avi"`
do
./myscript $file
done
谁能帮我?
谢谢
答案1
find -name "*.avi" -print0 | xargs -0 -n 1 echo
您不必echo
:xargs
find -name "*.avi" -print0 | xargs -0 -n 1 ./myscript
答案2
还:find -name "*.avi" -exec ./myscript '{}' \;
Womble 的答案在大多数情况下肯定有效,但 Xargs 在所有实现中都无法完美处理空格。我从未发现 find 的“exec”模式会中断。Solaris 在这方面特别不稳定。
显然,对于在 for 循环中简单地生成文件列表的输出,使用“-print”会更好。但是,如果您在文件列表上运行命令,则运行“-exec”选项会更有效。
答案3
如果不需要递归:
#!/bin/bash
for file in *.avi
do
./myscript "$file"
done
请注意,变量周围的引号是必不可少的。
编辑:
正如 kojiro 指出的那样,如果您需要递归并且拥有 Bash 4,那么您可以添加shopt -s globstar
并将 glob 更改为**/*.avi
。
答案4
除了基于 xargs 和 find -exec 的解决方案之外,还有管道到 while read 的选项。它的好处是允许您以更经典的循环方式构造脚本。让我将它应用到您的示例中。
find -name "*.avi" | while read avifile; do
./myscript "$avifile"
done