将文件名转换为小写

作者:Phil Hughes
我本来想说我昨天写的这篇文章,但是文件的时间戳是 1998 年 11 月 22 日。没有什么新东西,也没什么花哨的,但它能完成工作。

早在过去的好日子里,有一种操作系统似乎并不认为NAMEname是不同的。 结果是,有时当你从软盘(还记得它们吗?)传输文件时,软盘是在那个愚蠢的旧系统上创建的,你会在目录中塞满大写的文件名。 正如我们 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如果执行该命令将覆盖现有文件名,则提示确认。

加载 Disqus 评论