3

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

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

它应该更改为

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

7 回答 7

2

如果所有文件都以“.txt”结尾,您可以使用mmv(Multiple Move):

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

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

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

于 2009-05-11T13:32:29.033 回答
2

您必须注意名称冲突,但这应该可以正常工作:

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

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

于 2009-05-11T12:23:27.140 回答
1

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

for i in *.txt
do
    r=`basename $i .txt | sed 's/.$//'`
    mv $i ${r}_.txt
done
于 2009-05-11T12:20:52.497 回答
1

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

find . \( -type d ! -name . -prune \) -o \( -name "*.txt" \) | while read file
do 
    mv $file ${file%%?.txt}_.txt
done
于 2009-05-11T12:25:39.850 回答
1

使用该mv命令是否有明确要求?
perlrename实用程序是为这类事情编写的。它是基于 debian 的 linux 发行版的标准,但根据这个页面,它可以很容易地添加到任何其他发行版中。

如果它已经存在(或者如果您安装它),您可以执行以下操作:

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

上面包含的页面有一些关于正则表达式的基本信息,如果需要的话。

于 2009-05-11T13:07:57.050 回答
0

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

for i in *.txt; do
   j=`echo $i |sed 's/.\.txt/_.txt/'`
   mv $i $j
done
于 2009-05-11T12:20:51.280 回答
0

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

for FILE in *.txt; do
   mv $FILE ${FILE%%?.txt}_.txt
done
于 2009-05-11T12:24:09.900 回答