使用 Bash 将目录中的所有文件大写

Capitalize all files in a directory using Bash

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

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

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

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

mv theme*.jpg Theme*.jpg

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

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

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

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

在Bash 4中你可以直接使用parameter expansion来大写一个单词中的每个字母(^^)或者只是第一个字母(^)。

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

您可以使用模式来形成更复杂的大小写修改。

但是对于你的具体问题,你是不是太辛苦了?只需将出现在文件名开头的 "theme" 替换为 "Theme"。

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

我无法在 Bash 中得到我想要的东西。所以我花了 2 分钟让这个在 PHP 中工作。这是为正在寻找解决方案并且碰巧在他们的系统上有 PHP 的未来 google 员工准备的。

<?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);
}