重命名父目录时不重命名子目录

blu*_*ray 2 directory find rename

我的目录树如下所示 -

/media/blueray/Data/Test$ tree
.
??? What????
?   ??? What????
??? What????.txt
Run Code Online (Sandbox Code Playgroud)

当我运行命令时 find . -depth | rename 's/[?<>\\:*|\"]//g'

它说 -

Can't rename ./What????/What???? ./What/What: No such file or directory
Run Code Online (Sandbox Code Playgroud)

但是,运行该命令后,目录结构变为——

/media/blueray/Data/Test$ tree
.
??? What
?   ??? What????
??? What.txt
Run Code Online (Sandbox Code Playgroud)

在我看来,它find是从树的顶部开始搜索,所以它正在失去对树的跟踪。

这里的解决方案是什么?

Ste*_*itt 6

问题不是由 引起的find,而是由rename以下原因引起的:它正在处理完整路径,因此它尝试重命名./What????/What????./What/What,但由于What目录不存在(尚未)而失败。

rename仅使用处理文件-d名将解决此问题:

find . -depth | rename -d 's/[?<>\\:*|\"]//g'
Run Code Online (Sandbox Code Playgroud)

如果您的 版本rename不支持该-d选项(在 1.10 版中引入File::Rename,假设您rename是 Perl 版本),您find只能通过rename在每个目录中运行来传递文件名:

find . -depth -execdir rename 's/[?<>\\:*|\"]//g' {} +
Run Code Online (Sandbox Code Playgroud)

(感谢弗雷迪溶液)。