如何使用bash对目录中的每个文件执行某些操作?

时间:2009-08-21 07:12:14

标签: bash shell

我从这开始:

command *

但是当目录为空时它不起作用; *通配符成为文字“*”字符。所以我改用了这个:

for i in *; do
   ...
done

有效,但同样,如果目录为空则不行。我使用ls:

for i in `ls -A`

但当然,其中包含空格的文件名会被拆分。我尝试了-Q开关:

for i in `ls -AQ`

导致名称仍然被拆分,只有名称开头和结尾的引号字符。我在这里遗漏了一些明显的东西,还是比它应该更难?

5 个答案:

答案 0 :(得分:39)

假设您只想对文件执行某些操作,简单的解决方案是测试$ i是否为文件:

for i in * 
do
    if test -f "$i" 
    then
       echo "Doing somthing to $i"
    fi
done

你应该总是进行这样的测试,因为你几乎肯定不想以同样的方式处理文件和目录。请注意“$ i”周围的引号,以防止文件名包含空格的问题。

答案 1 :(得分:12)

find可能是你想要的。

find . | while read file; do
    # do something with $file
done

或者也许是这样:

find . -exec <command> {} \;

如果您不希望搜索包含子目录,则可能需要在find命令中添加-type f-maxdepth 1的组合。有关详细信息,请参阅find man page

答案 2 :(得分:8)

这取决于您是否要在命令提示符下键入此命令,以及您要应用于文件的命令。

如果是键入的话,你可以选择第二种选择并用命令代替无害的东西。我喜欢使用echo代替mv或rm,例如。

全部放在一行:

for i in * ; do command $i; done

当它起作用时 - 或者你可以看到它失败的地方,以及它是否无害,你可以按向上箭头,编辑命令然后重试。

答案 3 :(得分:5)

使用shopt防止扩展到* .txt

shopt -s nullglob
for myfile in *.txt
do
    # your code here
    echo $myfile

done

答案 4 :(得分:2)

这应该可以解决问题:

find -type d -print0 | xargs -n 1 -0 echo "your folder: {} !"
find -type f -print0 | xargs -n 1 -0 echo "your file: {} !"

print0 / 0用于避免空白问题