重命名 BASH 中的几个文件
Posted
技术标签:
【中文标题】重命名 BASH 中的几个文件【英文标题】:Rename several files in the BASH 【发布时间】:2011-01-25 20:29:09 【问题描述】:我想重命名文件编号:我有一个带有 '???' 的文件格式我需要把它们放在'????'中。
myfile_100_asd_4 to myfile_0100_asd_4
谢谢 阿尔曼。
不太优雅的解决方案:
#/bin/bash
snap=`ls -t *_???`
c=26
for k in $snap
do
end=$k
echo mv $k $k%_*_0$k##*__asd_4
(( c=c-1 ))
done
这对我有用,因为我也有 myfile_100 个文件。
【问题讨论】:
【参考方案1】:只需使用外壳,
for file in myfile*
do
t=$file#*_
f=$file%%_*
number=$(printf "%04d" $t%%_*)
newfile="$f_$number_$t#*_"
echo mv "$file" "$newfile"
done
【讨论】:
【参考方案2】:试试:
for file in `ls my*`
do
a=`echo $file | cut -d_ -f1`
b=`echo $file | cut -d_ -f2`
c=`echo $file | cut -d_ -f3,4`
new=$a_0$b_$c
mv $file $new
done
【讨论】:
使用 shell 扩展而不是ls
。并且 shell 具有字符串操作功能,因此实际上不需要外部命令。
ghostdog74:你能解释一下吗?
哇,我从来没有用过“cut”,它太有用了:)
@modi,我不是反对者。自己不要混蛋。即使我想投反对票,它仍然是我的选择。你会怎么做?
@arman, cut
是一个外部命令。每个找到的文件调用cut
3 次是“昂贵的”。【参考方案3】:
有一个名为 ren (manpage) 的 UNIX 应用程序支持使用搜索和替换模式重命名多个文件。您应该能够拼凑一个模式,将额外的 0 注入文件名。
编辑: 带有下载链接的项目页面可以在Freshmeat找到。
【讨论】:
在我的发行版 (Mandriva) 上,我只有:mren(1) Name mren - 重命名现有的 MSDOS 文件 no ren。 我注意到一些发行版似乎没有附带它,因此我提供了一个指向 Freshmeat 页面的链接以及指向源下载的链接。【参考方案4】:使用rename
,一个perl自带的小脚本:
rename 's/(\d3)/0$1/g' myfile_*
如果您在表达式之前将-n
参数传递给它,它只会打印它会执行的重命名,不会采取任何操作。这样您就可以在重命名文件之前验证它是否正常工作:
rename -n 's/(\d3)/0$1/g' myfile_*
【讨论】:
嗯,很遗憾我不能将此标记为另一种解决方案:)以上是关于重命名 BASH 中的几个文件的主要内容,如果未能解决你的问题,请参考以下文章