所以我想在每个带有特定字符串的文件上执行此命令。
这是我找到的脚本:
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-是目录)
答案 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}" --