如何使用命令 mv 将一个目录中的所有文件重命名为新名称。目录有 1000 多个文件,要求是将每个文件名的最后一个字符更改为某个特定的字符。示例:文件是
abc.txt
asdf.txt
zxc.txt
...
ab_.txt
asd.txt
它应该更改为
ab_.txt
asd_.txt
zx_.txt
...
ab_.txt
as_.txt
如何使用命令 mv 将一个目录中的所有文件重命名为新名称。目录有 1000 多个文件,要求是将每个文件名的最后一个字符更改为某个特定的字符。示例:文件是
abc.txt
asdf.txt
zxc.txt
...
ab_.txt
asd.txt
它应该更改为
ab_.txt
asd_.txt
zx_.txt
...
ab_.txt
as_.txt
如果所有文件都以“.txt”结尾,您可以使用mmv
(Multiple Move):
mmv "*[a-z].txt" "#1_.txt"
另外:会在重命名任何文件之前mmv
告诉您何时会产生冲突(在您的示例中:abc.txt 变为已经存在的 ab_.txt) 。
请注意,您必须引用文件名,否则 shell 会在mmv
看到它之前扩展列表(但mmv
通常也会捕获这个错误)。
您必须注意名称冲突,但这应该可以正常工作:
for i in *.txt ; do
j=$(echo "$i" | sed 's/..txt$/_.txt/')
echo mv \"$i\" \"$j\"
#mv "$i" "$j"
done
在您取消注释之后mv
(我留下了评论,以便您可以安全地看到它的作用)。引号用于处理带有空格的文件(在我看来是邪恶的、卑鄙的事情:-)。
如果您的文件都有 .txt 后缀,我建议使用以下脚本:
for i in *.txt
do
r=`basename $i .txt | sed 's/.$//'`
mv $i ${r}_.txt
done
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
使用该mv
命令是否有明确要求?
perlrename
实用程序是为这类事情编写的。它是基于 debian 的 linux 发行版的标准,但根据这个页面,它可以很容易地添加到任何其他发行版中。
如果它已经存在(或者如果您安装它),您可以执行以下操作:
rename -v 's/.\.txt$/_\.txt/' *.txt
上面包含的页面有一些关于正则表达式的基本信息,如果需要的话。
我不确定这是否适用于数千个文件,但在 bash 中:
for i in *.txt; do
j=`echo $i |sed 's/.\.txt/_.txt/'`
mv $i $j
done
您可以这样使用 bash 的${parameter%%word}
运算符:
for FILE in *.txt; do
mv $FILE ${FILE%%?.txt}_.txt
done