将名称包含大写的当前目录中的所有文件重命名为全小写

时间:2016-07-29 06:34:08

标签: shell

Iam尝试一个shell脚本,它将当前目录中名称包含大写字符的所有文件重命名为全小写。例如,如果目录包含名称为CoUnt.c的文件,则应将其重命名为count.c。

for f in *;
do
if [ -f "$f" ]; then
tr 'A-Z' 'a-z'
fi
done

但它不起作用。 对此有什么更好的解决方案吗?

5 个答案:

答案 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