我有下面的脚本 – 它应该使用find来循环文件名,但它接缝打破了空格的文件名称? 我需要文件名保持不变
#!/bin/bash for file in `find -name "*.avi"` do ./myscript $file done
谁能帮我?
谢谢
find -name "*.avi" -print0 | xargs -0 -n 1 echo
你不必在xargs echo :
find -name "*.avi" -print0 | xargs -0 -n 1 ./myscript
另外: find -name "*.avi" -exec ./myscript '{}' \;
Womble的答案在绝大多数情况下都是可行的,但是Xargs在所有实现中都不是完美的。 我从来没有find发现'exec'模式打破。 Solaris在这方面特别脆弱。
显然,'-print'将会更好地为for循环中的文件列表生成输出。 但是,如果您在文件列表上运行命令,只需运行“-exec”选项会更有效。
如果你不需要recursion:
#!/bin/bash for file in *.avi do ./myscript "$file" done
请注意,variables周围的引号是必不可less的。
编辑:
正如高次郎指出,如果你需要recursion,你有Bash 4,你可以添加shopt -s globstar并将glob更改为**/*.avi 。
除了基于xargs和find -exec的解决scheme之外,还有pipe道读取选项。 它的好处是允许您以更经典的循环方式来构build您的脚本。 让我把它应用到你的例子。
find -name "*.avi" | while read avifile; do ./myscript "$avifile" done