批量重命名只能更改单个字符

时间:2009-05-11 12:13:40

标签: unix file file-rename

如何使用命令mv将一个目录中的所有文件重命名为新名称。目录有1000个文件,要求是将每个文件名的最后一个字符更改为某个特定的字符。示例:文件

abc.txt
asdf.txt
zxc.txt
...
ab_.txt
asd.txt

它应该改为

ab_.txt
asd_.txt
zx_.txt
...
ab_.txt
as_.txt

7 个答案:

答案 0 :(得分:2)

你必须注意名称冲突,但这应该可行:

for i in *.txt ; do
    j=$(echo "$i" | sed 's/..txt$/_.txt/')
    echo mv \"$i\" \"$j\"
    #mv "$i" "$j"
done

取消注释mv后(我留下了评论,以便您可以安全地看到它的作用)。引号用于处理带空格的文件(在我看来,邪恶,邪恶的东西: - )。

答案 1 :(得分:2)

如果所有文件都以“.txt”结尾,则可以使用mmv(多次移动):

mmv "*[a-z].txt" "#1_.txt"

Plus:mmv会告诉您何时产生碰撞(在您的示例中:abc.txt变为ab_.txt已存在)之前 任何文件已重命名。

请注意,您必须引用文件名,否则shell会在mmv看到它之前展开列表(但mmv通常也会捕获此错误。)

答案 2 :(得分:1)

查找应该比for file in *.txt更有效,它将所有1000个文件扩展为一长串命令行参数。示例(更新为使用bash替换方法):

find . \( -type d ! -name . -prune \) -o \( -name "*.txt" \) | while read file
do 
    mv $file ${file%%?.txt}_.txt
done

答案 3 :(得分:1)

您是否明确要求使用mv命令?
perl rename实用程序是为这类事情编写的。它是基于debian的Linux发行版的标准,但根据this page,它可以很容易地添加到任何其他发行版。

如果它已经存在(或者你安装它),你可以这样做:

rename -v 's/.\.txt$/_\.txt/' *.txt

上面包含的页面提供了有关正则表达式和事物的一些基本信息(如果需要的话)。

答案 4 :(得分:0)

我不确定这是否适用于数千个文件,但是在bash:

for i in *.txt; do
   j=`echo $i |sed 's/.\.txt/_.txt/'`
   mv $i $j
done

答案 5 :(得分:0)

如果您的文件都有.txt后缀,我建议使用以下脚本:

for i in *.txt
do
    r=`basename $i .txt | sed 's/.$//'`
    mv $i ${r}_.txt
done

答案 6 :(得分:0)

您可以使用bash的${parameter%%word}运算符:

for FILE in *.txt; do
   mv $FILE ${FILE%%?.txt}_.txt
done