递归地对给定目录中的所有文件执行某些操作,包括子目录文件

时间:2015-09-28 18:01:05

标签: bash recursion

好的,我试图做的是用另一个单词更改文件中的某个单词。因此,如果运行像./prog.bash document1.txt document Document这样的程序,它会在document.txt中查找,每次看到document这个词时,它都会将其更改为Document

我成功完成了这项工作,但是如果用户输入文件夹名称,我必须递归浏览文件夹中的所有文件并更改所有文件,包括子目录中的文件。我目前的计划如下:

#!/bin/bash
function File {
    filename=$1
    echo "File $filename:"
    cat $filename
    if [ -w $filename ];
    then
        echo  "Changed into:"
        sed -i 's/'$old'/'$new'/g' $filename
        cat $filename
    else
        echo "File not changed due to lack of write permissions"
    fi
}

function directory {
    name=$1
    for f in $name/*; do
        if [ -f $f ];
        then
            File $f
        elif [ -d $f ];
        then
            directory $d
        fi
    done
}
filename=$1
old=$2
new=$3
if [ ! -e $filename ];
then
    echo "This file or folder does not exist"
    exit
elif [ -f $filename ];
then
    File $filename
elif [ -d $filename ];
then
    directory $filename
fi
exit

我当前的文件夹/文件树如下所示:

                  Folder
                    |
       -------------|-----------------------------------------
      |             Folder3                  |               |
      Folder2          |                    Document1       Document2
      |            Folder4
   Document3          |
                      |
         -------------|---------------------
         |                                  |
         Folder5      Document4           Document5

因此,当我使用./prog.bash Folder document Document调用该程序时,它需要查找所有5个文档中的更改。但目前它只查找文档1和文档2中的更改,然后查找分段错误。我理解为什么这个程序不起作用,但我无法弄清楚我如何搜索所有子目录。任何帮助或正确方向上的一点都会非常感激。

1 个答案:

答案 0 :(得分:0)

您需要熟悉“查找”命令。它是标准的Unix,用于遍历整个目录树。试试find .,您就会开始明白这个想法。接下来尝试find . -name \*.txt。越来越近 :-)。最后:

find . -name \*.txt -exec ./prog.bash {} document Document \;