繁体   English   中英

使用 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

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

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM