用新字符串替换部分文件夹名称

用新字符串替换部分文件夹名称

我找到了涉及该主题的各种答案,例如这个,但它们对我的目的不起作用。可能是因为“-”字符或者我如何设置它?

我正在使用带有终端的 Linux Mint (Debian)。

我有很多这样的文件夹和子文件夹:

folder1-Misc
folder2/afolder2name-Misc
folder2/afolder2name-SomethingElse
folder3/afolder3name-Misc
folder3/afolder3name-Blahblah
folder3/afolder3name-Anotherthing
folder4/afolder4name-Misc
folder4/afolder4name-Misc/insideafolder4name-Misc
folder5/afolder5name-Misc
folder4/afolder5name-Misc/insideafolder5name-Misc

我想从根文件夹开始并重命名包含-Miscwith的所有文件夹名称-Docs,这样上面的内容就会变成

folder1-Docs
folder2/afolder2name-Docs
folder2/afolder2name-SomethingElse
folder3/afolder3name-Docs
folder3/afolder3name-Blahblah
folder3/afolder3name-Anotherthing
folder4/afolder4name-Docs
folder4/afolder4name-Docs/insideafolder4name-Docs
folder5/afolder5name-Docs
folder4/afolder5name-Docs/insideafolder5name-Docs

我不想冒损坏任何文件夹内容(文件)或结构的风险。

上面的答案链接应该有效,但它不起作用......我认为它应该是这样的,但这不起作用:

find . -type f -exec rename 's/*-Misc/-Docs/g' {} +

将不胜感激任何帮助,希望这实际上是一个简单的解决方案:)

答案1

看来您正在使用另一个rename版本。 perl 版本就是您正在寻找的版本,通常它的命令是file-rename。就我而言,我必须安装该软件包perl-File-Rename

我看到的另一个问题是您正在使用-type f但这仅使用regular files但正如您所说您想重命名您的目录(和子目录)。因此,您可以使用-type d或简单地不指定该选项来处理任何类型。

尽管如此,我还是发现直接使用有问题-exec。当您使用find . -exec

./folder2
./folder2/afolder2name-SomethingElse
./folder2/afolder2name-Misc
./folder4
./folder4/afolder4name-Misc
./folder4/afolder4name-Misc/insideafolder4name-Misc
./folder4/afolder5name-Misc
./folder4/afolder5name-Misc/insideafolder5name-Misc
./folder1-Misc
./folder3
./folder3/afolder3name-Blahblah
./folder3/afolder3name-Anotherthing
./folder3/afolder3name-Misc
./folder5

当您想重命名子目录时,上面的输出将会出现问题。例如,有这样的:

/folder4/afolder4name-Misc
./folder4/afolder4name-Misc/insideafolder4name-Misc

将尝试重命名/folder4/afolder4name-Misc为,/folder4/afolder4name-Docs但下一个路径:./folder4/afolder4name-Misc/insideafolder4name-Misc将导致错误,因为 ./folder4/afolder4name-Misc已重命名为./folder4/afolder4name-Docs.

该问题的一个可能的解决方案是find使用 恢复输出tac。所以你的代码可以如下所示:

find . | tac | xargs -L1 file-rename 's/(.*)\-Misc/$1-Docs/g'

上面的代码可以工作,但我注意到它有点慢。

解决方案2:更快的方法是使用mv但需要更多指令:

find . ! -path . | tac | while read -r dir; do \
[[ "${dir##*/}" =~ .*-Misc ]] && mv "$dir" "${dir%-Misc}-Docs";done

相关内容