我正在尝试以递归方式将目录和子目录中的所有文件重命名为小写,但保持目录名称不变。
我发现的所有示例都将文件和目录重命名为小写,例如:
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
)。通过 找到的文件像命令一样链接在一起。这意味着更少的分叉,对于小操作来说,可以意味着显着的速度提升。[stat
ls
find
xargs
回答经过@Oli]