我使用这个命令递归地重命名文件:
find -iname \*.bak | rename 's/.bak/.old/'
但我想排除当前目录。例子:
.bak
dir1/.bak
dir2/.bak
...
在我想要这个之后:
.bak
dir1/.old
dir2/.old
...
我使用这个命令递归地重命名文件:
find -iname \*.bak | rename 's/.bak/.old/'
但我想排除当前目录。例子:
.bak
dir1/.bak
dir2/.bak
...
在我想要这个之后:
.bak
dir1/.old
dir2/.old
...
使用
find
支持-mindepth
谓词的 a:-mindepth
谓词允许您定义可以进行匹配的最小搜索深度。深度 0 是根搜索路径本身(.
),深度 1 是根搜索路径下方的任何内容(例如./somename
),深度 2 是其下方的任何内容(例如./somename/other
),等等。请注意,
-iname
不需要不区分大小写的匹配,因为无论如何您rename
都不会重命名具有其他类型的文件名后缀大写的文件,因此我已将其更改为-name
测试。我还修复了您的rename
调用,以便bak
名称中其他位置带有字符串的文件(例如 )rebak.bak
不会以奇怪的方式重命名(例如 intor.old.bak
)。我还添加
-type f
了只find
考虑常规文件,即不考虑目录等。对于更便携的解决方案:
这不依赖于
rename
实用程序。这
rename
直接从find
.有关的:
使用
bash
,您可以完全跳过find
,而是执行**
globbing 模式匹配任意数量的中间子目录。globstar
使用shell 选项启用此特殊模式。初始./*/
确保我们只查看当前目录的子目录,而不是当前目录本身。dotglob
shell 选项确保我们将隐藏名称与模式匹配。但是,上述内容不会专门挑选常规文件(但您的
find
命令也不会)。为此,请使用循环:这也会将符号链接重命名为常规文件。
尝试这个