如何使用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解决方案需要限制深度,所以子目录也不会被拾取。