Bash脚本读取目录中的所有文件

37

我如何遍历文件夹?我知道可以使用 for f in /var/files;do echo $f;done; 但是它会一次性输出目录中的所有文件。我想一个一个地处理每个文件并能够使用变量 $f。我认为 while 循环最适合这种情况,但我不知道该如何编写 while 循环。

感谢任何帮助。


2
for循环是完全正确的,但您正在循环遍历单个项,即字面目录名称/var/files。您的问题描述是不正确的;您发布的程序将只会回显/var/files。我怀疑您可能想要使用for f in /var/files/*。请注意,在所有地方都要使用双引号"$f" - tripleee
3个回答

86

应该可以使用简单的循环:

for file in /var/*
do
    #whatever you need with "$file"
done

请参阅bash文件名扩展


@Mu_Qiao - 在 shell 脚本中,我在 do 后面有两个命令。第一个是 echo $file,然后是 echo "hi"。目录中有 10 个文件。我得到的是十个文件名,然后是 hi,而不是 1,hi,2,hi,3,hi...等等。 - mike
好的,明白了。可能是因为我在目录名周围使用了引号。 - mike
@mike 是的,引号可以防止文件名扩展。 - Mu Qiao
@Mu_Qiao - 如果文件名中有空格,你该怎么办? - mike
@mike 没问题,只需在 $file 周围使用双引号即可。 - Mu Qiao

12

使用 while 循环可以这样写:

ls -f /var | while read -r file; do cmd $file; done

这种方法的主要缺点是 cmd 是在子shell 中运行的,如果你想设置变量,则会有一些困难。其主要优点是 shell 不需要将所有文件名加载到内存中,并且没有 globbing。当目录中有许多文件时,这些优点是非常重要的(这就是为什么我在 ls 上使用 -f;在一个大目录中,ls 本身可能需要几十秒才能运行,而 -f 可以显著加快速度。在这种情况下,“for file in /var/*”可能会因为 glob 错误而失败)。


不错的解决方案。这是唯一一个可以在非常完整的目录和复杂的命令中正常工作的方案。 - TaninDirect
但是包括 ... - sospedra

6
您可以不使用循环语句来实现:
find /path/to/dir -type f -exec /your/first/command \{\} \; -exec /your/second/command \{\} \; 

HTH


为什么要在 {} 中使用转义符号? - RogerS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接