将文件名转换为小写
于 2008 年 7 月 25 日
我本来想说我昨天写的这篇文章,但是文件的时间戳是 1998 年 11 月 22 日。没有什么新东西,也没什么花哨的,但它能完成工作。
早在过去的好日子里,有一种操作系统似乎并不认为NAME和name是不同的。 结果是,有时当你从软盘(还记得它们吗?)传输文件时,软盘是在那个愚蠢的旧系统上创建的,你会在目录中塞满大写的文件名。 正如我们 UNIX 老手们学到的一个巧妙技巧,可以让目录名在 ls 命令的输出中排在文件名前面(即,用大写字母开始目录名),拥有带大写字母的文件名令人恼火。
在使用 mv 命令太多次并输入类似mv FILE.TXT file.txt之后,我写了这个脚本。 我当时想我可以给它重新粉刷一下,但实际上,它确实能完成工作并且很容易理解。(当然,行号只是为了参考。)
1 #!/bin/sh 2 # lowerit 3 # convert all file names in the current directory to lower case 4 # only operates on plain files--does not change the name of directories 5 # will ask for verification before overwriting an existing file 6 for x in `ls` 7 do 8 if [ ! -f $x ]; then 9 continue 10 fi 11 lc=`echo $x | tr '[A-Z]' '[a-z]'` 12 if [ $lc != $x ]; then 13 mv -i $x $lc 14 fi 15 done
第 6 行开始一个循环(以第 15 行结束)。ls命令返回一个文件名列表,这些文件名依次分配给 shell 变量 x。 if 测试(第 8 到 10 行)检查当前文件名是否是普通文件。 如果不是,则跳过当前循环迭代中的其余语句。
如果要执行第 11 行,我们知道我们有一个普通文件。 使用tr我们将文件名转换为小写,并将新名称分配给 shell 变量lc。 然后第 12 行检查名称的小写版本是否与原始版本不同。 如果不同,则执行第 13 行以将原始文件的名称更改为新的小写名称。-i选项使mv如果执行该命令将覆盖现有文件名,则提示确认。