如何使用bash对目录中的每个文件执行操作?
我从这个开始:如何使用bash对目录中的每个文件执行操作?,bash,shell,Bash,Shell,我从这个开始: command * 但当目录为空时,它不工作;*通配符变为文字“*”字符。所以我换成了这个: for i in *; do ... done 这是有效的,但同样,如果目录为空,则无效。我求助于使用ls: for i in `ls -A` 当然,如果文件名中有空格,则会被拆分。我试着在-Q开关上钉上钉子: for i in `ls -AQ` 这会导致名称仍然被拆分,仅在名称的开头和结尾处使用引号字符。我是否遗漏了一些明显的东西,或者这比它应该做的更难?假设您只想对文件
command *
但当目录为空时,它不工作;*通配符变为文字“*”字符。所以我换成了这个:
for i in *; do
...
done
这是有效的,但同样,如果目录为空,则无效。我求助于使用ls:
for i in `ls -A`
当然,如果文件名中有空格,则会被拆分。我试着在-Q开关上钉上钉子:
for i in `ls -AQ`
这会导致名称仍然被拆分,仅在名称的开头和结尾处使用引号字符。我是否遗漏了一些明显的东西,或者这比它应该做的更难?假设您只想对文件做些什么,简单的解决方案是测试$I是否是一个文件:
for i in *
do
if test -f "$i"
then
echo "Doing somthing to $i"
fi
done
您确实应该经常进行这样的测试,因为您几乎肯定不希望以相同的方式处理文件和目录。请注意“$i”周围的引号可以防止包含空格的文件名出现问题。
find
可能是您想要的
find . | while read file; do
# do something with $file
done
或者像这样:
find . -exec <command> {} \;
find-执行{}\;
如果不希望搜索包含子目录,则可能需要将
-type f
和-maxdepth 1
组合添加到find命令中。有关详细信息,请参阅。这应该可以做到:
find -type d -print0 | xargs -n 1 -0 echo "your folder: {} !"
find -type f -print0 | xargs -n 1 -0 echo "your file: {} !"
print0/0用于避免出现空白问题。这取决于您是否要在命令提示符下键入此内容,以及您要将哪个命令应用于文件 如果它是键入的,您可以选择第二个选项,并用无害的内容替换命令。例如,我喜欢使用echo而不是mv或rm 把它全部放在一行:
for i in * ; do command $i; done
当它起作用时,或者您可以看到它在哪里失败,以及它是否无害,您可以按向上箭头,编辑命令并重试。使用shopt防止扩展到*.txt
shopt -s nullglob
for myfile in *.txt
do
# your code here
echo $myfile
done
使用find-typed-exec echo“your folder:{}”\;,您会感觉更好;。。。如果您的路径太深,xargs会遇到问题。这似乎是最简单的答案。奇怪的是,这么多的shell脚本指南总是告诉您要使用,但在CWD中没有文件时却不总是提到“文本”行为。当目录中有10.000多个文件时,不会中断的额外好处。@MSalters谁有那么多?上次我有这么多是因为我忘了一个拆分程序需要的是字节,而不是拆分文件的数量…这种情况经常发生,而且比你想象的还要多。愚蠢的Windows文件名加空格!我会为此受到严厉的批评,但是。。。关于脚本编写,我给同事的建议是:一旦你的脚本有了“if”或“while”,就应该把“shell”放在一边,选择“perl”:(我肯定有一些受虐的方法可以让它工作,但是哎哟。顺便说一句,Bombe的find-exec解决方案需要限制深度,所以子目录也不会被拾取。