【问题标题】:How to do something to every file in a directory using bash?如何使用 bash 对目录中的每个文件执行某些操作?
【发布时间】:2010-11-21 13:52:40
【问题描述】:

我是从这个开始的:

command *

但目录为空时不起作用; * 通配符变成文字“*”字符。所以我切换到这个:

for i in *; do
   ...
done

这可行,但同样,如果目录为空,则不行。我求助于使用 ls:

for i in `ls -A`

当然,带有空格的文件名会被拆分。我尝试添加 -Q 开关:

for i in `ls -AQ`

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

【问题讨论】:

  • 带有空格的愚蠢 Windows 文件名!我将为此受到重创(投反对票),但是......我对同事关于脚本的建议:一旦你的脚本有“if”或“while”,就该放下“shell”,然后选择up "perl" :-( 我敢肯定有一些自虐的方式可以使这项工作,但是哎呀。顺便说一下,Bombe 的 find -exec 解决方案需要限制深度,所以子目录也不会被拾取。

标签: bash shell


【解决方案1】:

假设你只想对文件做一些事情,简单的解决方案是测试 $i 是否是一个文件:

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

你真的应该总是做这样的测试,因为你几乎肯定不想以同样的方式对待文件和目录。注意 "$i" 周围的引号,它可以防止包含空格的文件名出现问题。

【讨论】:

  • 这似乎是最简单的答案。奇怪的是,这么多的 shell 脚本指南总是告诉你使用 ,但当 CWD 中没有文件时,并不总是提到字面的“”行为。
【解决方案2】:

find 可能是你想要的。

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

或者可能是这样的:

find . -exec <command> {} \;

如果您不希望搜索包括子目录,您可能需要将-type f-maxdepth 1 的组合添加到查找命令。详情请见find man page

【讨论】:

  • 增加了在目录中有 10.000 多个文件时不会中断的好处。
  • @MSalters 谁有这么多?上次我有这么多是当我忘记拆分程序需要字节而不是拆分文件的数量时......
  • 发生的次数比你想象的要多。
【解决方案3】:

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

如果它是键入的,您可以选择第二个选项,并用一些无害的东西代替命令。例如,我喜欢使用 echo 而不是 mv 或 rm。

全部放在一行上:

for i in * ; do command $i; done

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

【讨论】:

    【解决方案4】:

    使用 shopt 防止扩展为 *.txt

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

    【讨论】:

      【解决方案5】:

      这应该可以解决问题:

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

      print0 / 0 是为了避免空格问题

      【讨论】:

      • 你最好使用 find -type d -exec echo "your folder: {}" \;... 如果你的路径太深,xargs 会遇到问题。
      猜你喜欢
      • 1970-01-01
      • 2010-09-15
      • 2011-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 2019-06-16
      • 2018-06-08
      相关资源
      最近更新 更多