如何用不同的字符串递归替换所有文件夹和文件名中的字符串?我正在运行 Red Hat 6,我可以通过以下方式找到它们:
find . -name \*string\*
我已经设法对文件中的字符串执行此操作:
find . -type f -exec sed -i 's/string1/string2/g' {} +
但我怎样才能以类似的方式替换所有文件名呢?
答案1
使用find
和rename
:
find . -type f -exec rename 's/string1/string2/g' {} +
该命令的部分find . -type f
意思是搜索-type f
当前目录(.
)中的所有文件( )。
该
-exec
选项指示find
对其找到的每个文件执行命令。该
rename
命令用于重命名文件,此处使用的语法适用于 Perl 版本的rename
.是
's/string1/string2/g'
一个正则表达式,指定要搜索的内容以及用什么替换它。在本例中,string1
是要替换的字符串,string2
是替换字符串。末尾的/g
表示替换string1
文件名中所有出现的 。该
{}
符号是已找到的文件名的占位符find
。+
命令末尾的 告诉将find
多个文件名一次传递给 rename 命令,这比为每个单独的文件调用 rename 更有效。
因此,总的来说,此命令搜索当前目录中的所有文件,并执行命令rename
以替换找到的每个文件的文件名中出现的所有string1
内容。string2
答案2
for
您可以使用和mv
命令替换所有文件名。
abc
在这里,我将所有以名称开头的文本文件替换为xyz
for file in abc*.txt; do mv -v "$file" "${file/abc/xyz}"; done
以下命令将递归替换所有文件夹中的文件
for file in `find . -type f -name 'abc*.txt'`; do mv -v "$file" "${file/abc/xyz}"; done
答案3
zsh
使用's更容易zmv
:
autoload zmv # best in ~/.zshrc
zmv '(**/)(*string1*)' '$1${2//string1/string2}'
改成
zmv '(**/)(*string1*)(#qD)' '$1${2//string1/string2}'
如果您还想重命名隐藏文件或隐藏目录中的文件。