Linux 仅递归重命名文件

Linux 仅递归重命名文件

我正在尝试以递归方式将目录和子目录中的所有文件重命名为小写,但保持目录名称不变。

我发现的所有示例都将文件和目录重命名为小写,例如:

find ./ -depth -exec rename -n 'y/[A-Z]/[a-z]/' {} ";"

find . -type f|while read f; do mv "$f" "$(echo $f|tr '[:upper:]' '[:lower:]')"; done

如何保持目录不变但重命名所有文件?

答案1

您可以对目录名称进行重命名,因为find命令返回文件名的完整路径,然后重命名命令也会根据目录名称进行重命名。因此,如果您在目录中有一个文件DIR1/FILE,它将被重命名为,dir1/file而您不想重命名目录。

这是仅重命名文件名的命令:

find . -type f -exec rename -n 's:([^/]*$):lc($1):e' {} +

在上面的命令中,([^/]*$)仅匹配路径中不包含/一对括号内的最后一个部分(...),这使得匹配的部分成为匹配组。然后$1使用函数将匹配的部分(第一个匹配组的索引)转换为小写lc()

此时您需要选择-n对实际文件进行重命名。

-exec ... {} +适用于可以一次处理多个文件的命令(例如,,cat)。通过 找到的文件像命令一样链接在一起。这意味着更少的分叉,对于小操作来说,可以意味着显着的速度提升。[statlsfindxargs回答经过@Oli]

相关内容