遍历Linux文件夹树的底部

时间:2019-01-24 11:31:06

标签: linux bash

所以我想在每个带有特定字符串的文件上执行此命令。

这是我找到的脚本:

replace $old_string $new_string -- path

它奏效了。问题是我必须这样做:

replace "import firebase" "import {firebase}" -- ./*/*

然后这个:

replace "import firebase" "import {firebase}" -- ./*/*/*

然后这个:

replace "import firebase" "import {firebase}" -- ./*/*/*/*

,依此类推。终于,我走到了尽头,一切都成功了。

但是现在我想编写一个脚本以备将来使用,很明显,我不想创建一个不断循环的循环,试图不断深入。

那么如何使脚本遍历树并在途中更改文件?

我现在的脚本:

echo "Give me the old string"
read old_string
echo "Give me the new string"
read new_string
echo "Give me the path"
read path

cd $path
replace $old_string $new_string -- #**/* something like this? I'm stuck here
  

〜/ Documents / Projects / uczichapp-react / src $替换“ import {firebase}”“ import firebase”-./*/**

     

替换:读取文件'./Components/classes'时出错(错误代码:21-是目录)

     

替换:读取文件'./Components/globals'时出错(错误代码:21-是目录)

     

替换:读取文件'./Components/navigation'时出错(错误代码:21-是目录)

     

替换:读取文件'./Components/shared'时出错(错误代码:21-是目录)

     

替换:读取文件'./Components/solver'时出错(错误代码:21-是目录)

     

替换:读取文件'./Components/student'时出错(错误代码:21-是目录)

3 个答案:

答案 0 :(得分:2)

您可以使用find命令并将其输出通过管道传递到xargs

find . -type f | xargs replace "import firebase" "import {firebase}" -- 

或通过使用find直接执行:

find . -type f -exec replace "import firebase" "import {firebase}" -- {} +

答案 1 :(得分:2)

Bash具有globstar选项。启用shopt -s globstar后,您可以编写**来选择任意深度的所有路径。

组合的*/**/*/**/*/*/*等在工作目录下一层开始列出所有文件和目录。
全局*/**并不完全等效,但应该对您有用。它将列出从工作目录下的零层开始的所有目录和从工作目录下的一层开始的所有文件。由于replace仍然无法处理目录,因此与*/**/*/*等相比,应该不成问题。

shopt -s globstar
replace "import firebase" "import {firebase}" -- ./*/**

答案 2 :(得分:1)

grep -rl pattern为您提供当前目录匹配模式下的文件列表。然后,您可以使用它来进行替换以进行修改。

grep -rl "import firebase" | xargs replace "import firebase" "import {firebase}" --