我的 Linux 系统上有一个文件夹,它与其他计算机(其中一些与 Windows)交叉同步。问题是,在该文件夹中存在“大小写重复”的文件,即它们的文件名相同,只是一个或多个字符是大写与小写。对于 Linux 系统来说这不是问题,但对于 Windows 系统来说却是问题,并且它会抱怨文件名重复。
是否有一种简单的命令行方法来查找和替换此类文件名,例如“将所有文件名转换为小写,如果这导致两个同名文件将“1”附加到其中一个文件”?
答案1
如果您想避免重新发明轮子,您可以使用该mv
命令的内置功能来执行自动编号备份;如果您的 shell 本身支持大小写转换,那么可能很简单
for f in *; do mv --backup=numbered -- "$f" "${f,,}"; done
默认备份编号格式为.~1~
,例如给出
SOME FILE sOmE fIlE some file
然后
$ for f in *; do mv -v --backup=numbered -- "$f" "${f,,}"; done
‘SOME FILE’ -> ‘some file’ (backup: ‘some file.~1~’)
‘sOmE fIlE’ -> ‘some file’ (backup: ‘some file.~2~’)
mv: ‘some file’ and ‘some file’ are the same file
如果您不喜欢默认编号,您可以随时更改它;如果您的系统包含基于 perl 的rename
命令,可能类似于
$ rename -v -- 's/\.~(\d+)~/$1/' *.~*~
some file.~1~ renamed as some file1
some file.~2~ renamed as some file2
终于给予
$ ls
some file some file1 some file2