如何在Linux中递归重命名文件夹

时间:2020-09-02 16:44:11

标签: linux

我想重命名包含在以“测试”开头的特定文件夹中的所有文件夹,并以“产品”代替。 例: 在主文件夹中,有以下文件夹:

Test1
Test2
Test3
....

我想将它们重命名为:

Product1
Product2
Product3
...

1 个答案:

答案 0 :(得分:0)

据我的正确理解,您不想“递归”重命名文件,但是想重命名多个文件。

也许这不是最好的方法,但我会这样:

for a in Test*; do mv $a `echo $a | sed -e s/Test/Products/`; done

说明:

for a in Test*; do <some command> ; done

这将为每个与模式Test*相匹配的文件执行一些命令。 $a是文件名的占位符。

echo $a | sed -e s/Test/Products/

Test替换为Products时,此命令将打印文件名。如果文件名($aTest123,该命令将打印Products123

mv $a `<some command>`

此命令重命名文件$a。新文件名是命令<some command>打印的文本。

如果您真的想递归执行重命名(在所有子目录中),则可以使用find命令:

for a in `find . | grep Test`; do ...

编辑

我想重命名文件夹而不是文件

文件夹是Linux中的某种“文件”;您所谓的“文件”在Linux中称为“常规文件”。而且上面的命令不能区分文件夹和“常规文件”。

因此,如果您的父文件夹不包含与名称模式Test*匹配的任何“常规文件”(或符号链接或管道...),则可以使用上面的命令。

如果父文件夹同时包含子文件夹和与名称模式Test*匹配的其他类型的文件(例如“常规文件”或符号链接),而您只想重命名子文件夹,则您可以使用find命令选择当前父文件夹中的所有文件夹:

for a in `find -maxdepth 1 -type d | grep /Test`; do ...

编辑2

我不知道答案之一中提到的rename命令是否与您的问题相关。而且rename工具似乎并非在每个Linux发行版中都可用。

使用rename可以通过以下方式进行:

rename Test Product `find -maxdepth 1 -type d`

这将搜索当前目录中的所有子目录,并将名称中的Test替换为Product。名为MyTest5的子目录将变成MyProduct5

但是,名为Test6的常规文件不会重命名。

如果您只想重命名以Test开头的目录,则可以按照以下方式进行操作:

rename Test Product `find -maxdepth 1 -type d | grep /Test`

Test5将变为Product5,但MyTest5将不会重命名。

不幸的是,我自己没有使用过rename工具,所以我不确定这是否真的有用。