递归查找所有名为“file.txt”的文件并执行sed命令

dwu*_*uuu 6 sed find shell-script

我的任务的挑战是file.txt可以在子文件夹或子子文件夹中。一般结构如下所示:

   folder
     |___subfolder
             |_____file.txt
     |
     |___subfolder
             |____subfolder
                      |_______file.txt
     etc
Run Code Online (Sandbox Code Playgroud)

我之前的代码没有处理子子文件夹,我不知道如何添加这部分(因为某些子文件夹没有任何后续文件夹)

 for dir in ./*/ ; do
        if [ -d "$dir" ]; then 
           cd $d;
           for subdir in ./*/; do
               cd $subdir && $(sed command file.txt) && cd ..;
           done
           cd ..
        fi
done
Run Code Online (Sandbox Code Playgroud)

我还了解到有一种使用方法find,例如:

find . -name 'file.txt' | sed command file.txt
Run Code Online (Sandbox Code Playgroud)

显然这个不起作用,因为find只将目录返回到我的file.txt

Joh*_*024 17

尝试:

find . -name 'file.txt' -exec sed command {} +
Run Code Online (Sandbox Code Playgroud)

file.txt会在这些文件的子目录中找到所有命名为该文件的文件,.sed command针对这些文件运行。

如果要sed就地修改这些文件,请添加该-i选项。

虽然-exec ... +现在POSIX要求(帽子提示:jordanm),但有些人可能正在使用find不支持+. 如果您有其中之一,请使用(帽子提示:unxnut):

find . -name 'file.txt' -exec sed command {} \;
Run Code Online (Sandbox Code Playgroud)

更安全的选择

如果对目录结构进行快速更改,-exec则可能会出现竞争条件。为了提高安全性,请使用-execdir(帽子提示:unxnut):

find . -name 'file.txt' -execdir sed command {} +
Run Code Online (Sandbox Code Playgroud)

注意,如果你的当前目录在你的PATH,那么-execdir将拒绝运行。