Iam尝试一个shell脚本,它将当前目录中名称包含大写字符的所有文件重命名为全小写。例如,如果目录包含名称为CoUnt.c的文件,则应将其重命名为count.c。
for f in *;
do
if [ -f "$f" ]; then
tr 'A-Z' 'a-z'
fi
done
但它不起作用。 对此有什么更好的解决方案吗?
答案 0 :(得分:2)
问题是tr
接受来自stdin
的值。因此,为了在每个文件名中将上到下翻译,您可以执行以下操作:
#!/bin/sh
for f in *
do
[ -f "$f" ] || continue
flc=$(echo "$f" | tr 'A-Z' 'a-z') ## form lower-case name
[ "$f" != "$flc" ] && echo mv "$f" "$flc"
done
(注意:在对echo
之前移除mv
以在对操作满意后实际移动文件)
答案 1 :(得分:2)
您没有将任何数据传递到tr
程序,也没有捕获任何输出。
如果您使用sh
:
for f in *[A-Z]*
do
if [ -f "$f" ]; then
new_name=$(echo "$f"|tr 'A-Z' 'a-z')
mv "$f" "$new_name"
fi
done
请注意缩进 - 它使代码更易于阅读。
如果您使用的是bash
,则无需使用tr
之类的外部程序,您可以使用bash扩展:
for f in *[A-Z]*
do
if [[ -f $f ]]; then
new_name=${f,,*}
mv "$f" "$new_name"
fi
done
答案 2 :(得分:2)
由于我无法在此处添加评论帖子, 使用sed,它适用于我
#!/斌/庆典
for i in *
do
if [ -f $i ]
then
kar=$(echo "$i" | sed 's/.*/ \L&/')
mv "$i" "$kar"
done
答案 3 :(得分:1)
以下代码正常。
for f in *
do
if [ -f $f ]; then
echo "$f" | tr 'A-Z' 'a-z' >/dev/null
fi
done
答案 4 :(得分:1)
我建议使用rename
因为它简单,高效,并且当两个不同的文件解析为相同的结果时也会检查冲突:
您可以将它与Perl正则表达式一起使用:
rename 'y/A-Z/a-z/' *
可用的文档和示例here。