bash:通过目录中的所有文件进行(递归)处理

bash:通过目录中的所有文件进行(递归)处理,bash,ubuntu,Bash,Ubuntu,我想编写一个bash脚本(递归地)处理特定类型的所有文件 我知道我可以使用find thusly获得匹配的文件列表: 找到-名称“*.ext” 我想在脚本中使用此选项: 具有给定扩展名的递归文件列表 获取完整的文件路径名 将完整路径名传递给另一个脚本 检查脚本中的返回代码。如果非零,则记录无法处理的文件的名称 我的第一次尝试(伪代码)如下所示: ROOT_DIR = ~/work/projects cd $ROOT_DIR for f in `find . -name "*.ext"` do

我想编写一个bash脚本(递归地)处理特定类型的所有文件

我知道我可以使用find thusly获得匹配的文件列表:

找到-名称“*.ext”

我想在脚本中使用此选项:

  • 具有给定扩展名的递归文件列表
  • 获取完整的文件路径名
  • 将完整路径名传递给另一个脚本
  • 检查脚本中的返回代码。如果非零,则记录无法处理的文件的名称
  • 我的第一次尝试(伪代码)如下所示:

    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上运行时使用
    |而read
    迭代文件名是可以的,只要没有要处理的带有carrier return的文件:

    find . -name '*.ext' \( -exec ./some_other_script "$PWD"/{} \; -o -print \)
    
    find . -name '*.ext' | while IFS=$'\n' read -r FILE; do
      process "$(readlink -f "$FILE")" || echo "error processing: $FILE"
    done
    

    如果您使用“find$ROOT_DIR-name”*.exe”,则无需修改前导“/”。+1很好的解决方案,我不知道您可以这样使用-o。唯一的问题是,有时(不是这里)你需要调用一个函数而不是一个外部可执行文件。。。。(让我想起Perl!)。我不明白。如何将文件名传递给另一个脚本,以及如何知道脚本是否返回非零,以便我知道如何执行操作?@skyeagle:
    -exec
    谓词中的
    {}
    指示在何处注入当前匹配项。
    -exec
    谓词本身测试命令的结果代码,如果为0,则生成true,否则生成false。我不会说官方完全不鼓励这样做。它比$(find)中的f要好得多。如果文件名中有空格、制表符或换行符,则可能会出现问题。它可以这样改进:
    如果IFS=$'\n'read-r FILE
    @Dennis,我现在找不到该页面(可能不是那么正式),但不建议使用“while | read”,因为carrier返回的是文件的有效字符(幸运的是没有人使用它们)。补充你的建议。这样的假设总是有问题的。即使“普通”用户经常避免文件名中的换行符,但这并不意味着没有人这样做,攻击者肯定会这样做。任何程序都应该努力接受所有允许的文件名;幸运的是,这在每一种真正的编程语言中都很容易,这是避免使用shell脚本的另一个原因。@Philipp:嗯,这是一个更一般的讨论。我不会称shell语言为“非真实编程语言”,但它们确实有其缺点和历史包袱。然而,他们设计了有史以来最强大的编程概念之一:管道,他们值得高度尊重。也许你在想。这篇文章很好地讨论了文件名带来的挑战。