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

时间:2015-06-23 15:11:21

标签: macos bash rename

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

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

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

我也试过这个,但它没有用:

mv theme*.jpg Theme*.jpg

3 个答案:

答案 0 :(得分:5)

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

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

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

但是对于你的具体问题,你不是在努力工作吗?当文件名出现时,只需将“主题”一词替换为“主题”一词。

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

答案 1 :(得分:2)

您的第一次尝试已关闭,但tr会对其输入中的每个字符进行操作。

您需要使用可以对单个字符进行操作的sed或限制tr来查看第一个字符。

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

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

答案 2 :(得分:0)

我无法在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);
}