【问题标题】:Capitalize all files in a directory using Bash使用 Bash 将目录中的所有文件大写
【发布时间】:2015-09-09 11:32:54
【问题描述】:

我有一个名为“Theme_1”的目录,我想将所有以“theme”开头的文件名大写。每个文件名的第一个字母都是小写的,我希望它是大写的。

我试过了,但文件名中的所有字母都是大写的,这不是我想要的。

for f in * ; do mv -- "$f" "$(tr [:lower:] [:upper:] <<< "$f")" ; done

这个我也试过了,还是不行:

mv theme*.jpg Theme*.jpg

【问题讨论】:

    标签: macos bash rename


    【解决方案1】:

    我无法在 Bash 中得到我想要的东西。所以我花了 2 分钟的时间让这个在 PHP 中工作。这适用于正在寻找解决方案并碰巧在他们的系统上安装 PHP 的未来谷歌用户。

    <?php
    
    foreach(glob(__DIR__.'/*') as $filename) {
        if($filename === '.' || $filename === '..') { continue; }
    
        // To only capitalize the first letter of the file
        $new_filename = ucfirst(basename($filename));
    
        // To capitalize each word in the filename
        //$new_filename = ucwords(basename($filename));
        echo __DIR__.'/'.$new_filename."\n";
        rename($filename, __DIR__.'/'.$new_filename);
    }
    

    【讨论】:

      【解决方案2】:

      在 Bash 4 中,您可以直接使用 parameter expansion 将单词中的每个字母 (^^) 或仅首字母 (^) 大写。

      for f in *; do
          mv -- "$f" "${f^}"
      done
      

      您可以使用模式来形成更复杂的案例修改。

      但是对于您的具体问题,您是不是太努力了?当“主题”出现在文件名的开头时,只需将“主题”一词替换为“主题”即可。

      for f in theme*; do
          mv "$f" "Theme${f#theme}"
      done
      

      【讨论】:

      • 谢谢。第二个解决方案对我有用,但不是第一个返回 ${f^}: bad substitution
      • @StefaniaF.Cardenas 这可能意味着您的 bash 对于那些 case-mod 替换来说太旧了。
      【解决方案3】:

      您的第一次尝试很接近,但tr 对其输入中的每个字符都进行了操作。

      您要么需要使用像 sed 这样可以对单个字符进行操作的东西,要么将 tr 限制为只能看到第一个字符。

      for f in * ; do
          mv -- "$f" "$(tr [:lower:] [:upper:] <<< "${f:0:1}")${f:1}"
      done
      

      使用Shell Parameter Expansion 只给出文件名的第一个字符tr,然后扩展文件名的其余部分。

      【讨论】:

      • 这也很有帮助,因为现在我知道如何将目录中所有文件名的第一个字符大写,但我接受了@kojiro 的回答,因为这也改变了不开始的文件名带有“主题”。
      猜你喜欢
      • 2010-09-17
      • 2011-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-10
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      相关资源
      最近更新 更多