bash:处理(递归地)目录中的所有文件

时间:2010-12-10 15:32:58

标签: bash ubuntu

我想写一个bash脚本(递归地)处理某种类型的所有文件。

我知道我可以通过使用find得到匹配的文件列表:

找到。 -name“* .ext”

我想在脚本中使用它:

  1. 递归地删除具有给定扩展名的文件列表
  2. 获取完整文件路径名
  3. 将完整路径名传递给另一个脚本
  4. 检查脚本中的返回代码。如果不为零,请记录无法处理的文件的名称。
  5. 我的第一次尝试看起来像(伪代码):

    ROOT_DIR = ~/work/projects
    cd $ROOT_DIR
    for f in `find . -name "*.ext"`
    do
        #need to lop off leading './' from filename, but I havent worked out how to use
        #cut yet
        newname = `echo $f | cut -c 3
        filename = "$ROOT_DIR/$newname"
    
        retcode = ./some_other_script $filename
    
        if $retcode ne 0
           logError("Failed to process file: $filename")
    done
    

    这是我第一次尝试编写bash脚本,因此上面的代码段不太可能运行。但是,希望我正在尝试做的事情的逻辑足够清楚,有人可以展示如何加入点并将上面的伪代码转换为工作脚本。

    我在Ubuntu上运行

2 个答案:

答案 0 :(得分:12)

find . -name '*.ext' \( -exec ./some_other_script "$PWD"/{} \; -o -print \)

答案 1 :(得分:2)

只要没有要回收载体的文件,使用| while read迭代文件名就可以了:

find . -name '*.ext' | while IFS=$'\n' read -r FILE; do
  process "$(readlink -f "$FILE")" || echo "error processing: $FILE"
done