重命名 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 中的几个文件的主要内容,如果未能解决你的问题,请参考以下文章

用于递归重命名文件夹的 Bash 脚本

如何重命名 bash 中的文件以增加名称中的数量?

如何使用 bash 脚本重命名当前目录及其子目录中的文件?

在 bash 脚本中获取祖父目录 - 为路径中的目录重命名文件

在 bash shell 中使用重命名命令重命名文件

使用 bash 脚本批量重命名 FTP 服务器上的文件