我有一个名为" Theme_1"的目录。我希望将所有以"主题"开头的文件名大写。每个文件名的第一个字母都是小写的,我希望它是大写的。
我试过这个,但文件名中的所有字母都是大写的,这不是我想要的。
for f in * ; do mv -- "$f" "$(tr [:lower:] [:upper:] <<< "$f")" ; done
我也试过这个,但它没有用:
mv theme*.jpg Theme*.jpg
答案 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);
}