【问题标题】:Appending consecutive numbers to file names将连续数字附加到文件名
【发布时间】:2017-02-17 20:54:35
【问题描述】:

我有一个类似文件的列表

Ortho234.phy
Ortho671.phy
Ortho880.phy and so on

我想为数组作业将它们重命名为

Ortho234.1.phy
Ortho671.2.phy
Ortho880.3.phy

我试过这个,但这会替换并将文件命名为 1.phy、2.phy 等等。

 a=1
 for i in *.phy; do
     new=$(printf "%04d.phy" "$a") 
     mv -- "$i" "$new"
     let a=a+1
 done

【问题讨论】:

  • i 是您的文件名,您没有使用它。
  • 就我个人而言,我觉得你有一个 xy 问题,因为重命名文件并没有带来任何好处,最好寻求帮助来解决实际的数组问题。文件的顺序仍与添加新编号之前的顺序相同。

标签: for-loop awk sed


【解决方案1】:

以下任何一个命令都可以完成您的工作

c=0 rename 's/\./sprintf(".%d.",++$ENV{c})/e' *.phy  

rename 's/\./".".++$a."."/e' *.phy                  

rename '$a++; s/\./.$a./e' *.phy                   

n=1;for f in *.phy; do mv "$f" "${f%.*}.$n.${f##*.}"; n=$((n+1)); done

任一

它执行perl s/// 表达式,并从 原来的替换字符串。在我使用的替换字符串中 sprintf 来格式化名字,这里我使用环境变量cas 柜台

$ touch Ortho234.phy  Ortho671.phy  Ortho880.phy

$ ls *.phy -1
Ortho234.phy
Ortho671.phy
Ortho880.phy

$ c=0 rename 's/\./sprintf(".%d.",++$ENV{c})/e' *.phy

$ ls *.phy -1
Ortho234.1.phy
Ortho671.2.phy
Ortho880.3.phy

$ touch Ortho234.phy  Ortho671.phy  Ortho880.phy

$ ls *.phy -1
Ortho234.phy  
Ortho671.phy  
Ortho880.phy

$ n=1;for f in *.phy; do mv "$f" "${f%.*}.$n.${f##*.}"; n=$((n+1)); done

$ ls *.phy -1
Ortho234.1.phy  
Ortho671.2.phy  
Ortho880.3.phy

$ touch Ortho234.phy  Ortho671.phy  Ortho880.phy

$ ls *.phy -1
Ortho234.phy
Ortho671.phy
Ortho880.phy

$ rename 's/\./".".++$a."."/e' *.phy

$ ls *.phy -1
Ortho234.1.phy
Ortho671.2.phy
Ortho880.3.phy

$ touch Ortho234.phy  Ortho671.phy  Ortho880.phy

$ ls *.phy -1
Ortho234.phy
Ortho671.phy
Ortho880.phy

$ rename '$a++; s/\./.$a./e' *.phy

$ ls *.phy -1
Ortho234.1.phy
Ortho671.2.phy
Ortho880.3.phy

【讨论】:

  • 我选择 2 号门! (可移植性++)...如果您删除ParsingLS 选项,我会赞成。 :-)
  • 也可以使用rename 's/\./".".++$a."."/e' *.phyrename '$a++; s/\./".$a."/e' *.phy,利用sort global variables
  • @Sundeep:感谢您的建议
  • 刚刚意识到第二个建议不需要erename '$a++; s/\./.$a./' *.phy
  • e 代表表达式 's/\./".".++$a."."/e' 是什么意思?如果我没有弄错“。” ++$a 之前和之后是 perl 的字符串连接运算符?
【解决方案2】:

这应该可以完成工作:

a=1
for i in *.phy; do
filepart=$(echo $i | sed 's/.phy//g')
new=$(printf "%s.%d.phy" "$filepart" "$a")
mv -- "$i" "$new"
let a=a+1
done

filepart 是文件名,没有扩展名。

【讨论】:

    【解决方案3】:
    awk -F\. '{print $1"."NR"."$2}' file
    
    Ortho234.1.phy
    Ortho671.2.phy
    Ortho880.3.phy
    

    【讨论】:

      【解决方案4】:

      awk 命令也有助于获得所需的输出。 NR 给出行号并在. 上拆分输入并根据需要重写数组,如下所示

      awk '{split($0,a,"."); print a[1]"."NR"."a[2]}' file
      

      file 是包含以下值的输入文件

      Ortho234.phy
      Ortho671.phy
      Ortho880.phy
      

      【讨论】:

      • awk 可以读取 Input_file 本身,无需使用 cat Input_file | awk .... 然后命令。它通常被称为UUOC(无用的cat命令)。
      猜你喜欢
      • 1970-01-01
      • 2013-09-30
      • 2023-03-09
      • 1970-01-01
      • 2017-09-11
      • 2016-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多