如何使用命令mv将一个目录中的所有文件重命名为新名称。目录有1000个文件,要求是将每个文件名的最后一个字符更改为某个特定的字符。示例:文件
abc.txt
asdf.txt
zxc.txt
...
ab_.txt
asd.txt
它应该改为
ab_.txt
asd_.txt
zx_.txt
...
ab_.txt
as_.txt
答案 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