【问题标题】:Rename several files in the BASH重命名 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 个文件。

【问题讨论】:

    标签: bash renaming


    【解决方案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/(\d{3})/0$1/g' myfile_*
      

      如果您在表达式之前将-n 参数传递给它,它只会打印它会执行的重命名,不会采取任何操作。这样您就可以在重命名文件之前验证它是否正常工作:

      rename -n 's/(\d{3})/0$1/g' myfile_*
      

      【讨论】:

      • 嗯,很遗憾我不能将此标记为另一种解决方案:)
      猜你喜欢
      • 2013-07-08
      • 2014-01-06
      • 2013-03-01
      • 1970-01-01
      • 2020-02-18
      • 1970-01-01
      • 2012-12-31
      • 2019-08-21
      • 2016-08-01
      相关资源
      最近更新 更多