我找到了涉及该主题的各种答案,例如这个,但它们对我的目的不起作用。可能是因为“-”字符或者我如何设置它?
我正在使用带有终端的 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
我想从根文件夹开始并重命名包含-Misc
with的所有文件夹名称-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