我有这个狂欢:
replace="s/AAAA/BBBB/g";
find myDirectory/. -type f -print0 | xargs -0 sed -i $replace;
这将递归扫描树并替换其中文件中所有myDirectory
出现的。AAAA
BBBB
但我想限制这种情况发生在特定扩展名的文件上,例如.txt
,,,.read
.po
我如何施加这个限制?
答案1
您可以使用-name
find 选项来根据文件名限制匹配。
find myDirectory/. -type f -name '*.txt' -print0 | xargs -0 sed -i "$replace"
对于多个扩展,您可以使用-o
(或) 并将它们分组()
。
find myDirectory/. -type f \( -name '*.txt' -o -name '*.read' \) -print0 | xargs -0 sed -i "$replace"
另一个可以进行的改进是使用-exec
代替xargs
.这更加便携并且消除了子外壳。
find myDirectory/. -type f -name '*.txt' -exec sed -i "$replace" {} +
答案2
将这些设置添加到您的.bashrc
:
shopt -s extglob globstar
extglob
打开一些额外的图案,包括@(…)
析取的构造。globstar
打开**/
递归遍历目录。
那么你不需要使用find
:
sed -i "$replace" mydirectory/**/*.@(txt|read|po)
在 zsh 中,你不需要任何特殊选项,只需运行
sed -i $replace mydirectory/**/*.(txt|read|po)
如果您有很多文件,您可能会看到类似“超出命令行长度限制”的消息。但现代 Linux 系统上的限制非常高,您不太可能遇到它。
答案3
我成功地尝试了这一点——用 AOS 替换 DBA 的出现
sed -i -E "s/DBA/AOS/g" *.sh