[英]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.