如何替换所有文件夹和文件名中的字符串

如何替换所有文件夹和文件名中的字符串

如何用不同的字符串递归替换所有文件夹和文件名中的字符串?我正在运行 Red Hat 6,我可以通过以下方式找到它们:

find . -name \*string\*

我已经设法对文件中的字符串执行此操作:

find . -type f -exec sed -i 's/string1/string2/g' {} +

但我怎样才能以类似的方式替换所有文件名呢?

答案1

使用findrename

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}'

如果您还想重命名隐藏文件或隐藏目录中的文件。

相关内容