代码之家  ›  专栏  ›  技术社区  ›  David Oneill

向文件名添加前导零的Linux shell脚本

  •  52
  • David Oneill  · 技术社区  · 14 年前

    我有一个文件夹,里面有1700个文件。他们都被命名为 1.txt 1497.txt

    23.txt 0023.txt .

    \d.txt (即,一个数字,一个句点,然后是字母 txt )?

    以下是我目前掌握的情况:

    for a in [command i need help with]
    do
      mv $a 000$a
    done
    

    基本上,运行三次,在那里使用命令来查找一位、两位和三位文件名(初始零的数量发生了变化)。

    9 回复  |  直到 7 年前
        1
  •  52
  •   Community Mr_and_Mrs_D    7 年前

    尝试:

    for a in [0-9]*.txt; do
        mv $a `printf %04d.%s ${a%.*} ${a##*.}`
    done
    

    更改文件名模式( [0-9]*.txt )必要时。


    一种通用枚举重命名,它对文件名的初始集不作任何假设:

    X=1;
    for i in *.txt; do
      mv $i $(printf %04d.%s ${X%.*} ${i##*.})
      let X="$X+1"
    done
    

    关于同一主题:

        2
  •  17
  •   Dennis Williamson    14 年前

    使用 rename ( prename 在某些情况下,可以使用Perl表达式进行重命名。如果名称冲突,脚本将跳过重命名。

    下面的命令只重命名四位或更少数字后跟“.txt”扩展名的文件。它不会重命名不完全符合该模式的文件。它不会截断由四个以上数字组成的名称。

    rename 'unless (/0+[0-9]{4}.txt/) {s/^([0-9]{1,3}\.txt)$/000$1/g;s/0*([0-9]{4}\..*)/$1/}' *
    

    Original    Becomes
    1.txt       0001.txt
    02.txt      0002.txt
    123.txt     0123.txt
    00000.txt   00000.txt
    1.23.txt    1.23.txt
    

    到目前为止给出的其他答案将尝试重命名不符合模式的文件,为包含非数字字符的文件名生成错误,执行会产生名称冲突的重命名,尝试重命名名称中有空格的文件失败,以及可能出现的其他问题。

        3
  •  14
  •   C. K. Young    14 年前
    for a in *.txt; do
      b=$(printf %04d.txt ${a%.txt})
      if [ $a != $b ]; then
        mv $a $b
      fi
    done
    
        4
  •  9
  •   rkhayrov    14 年前

    ls | awk '/^([0-9]+)\.txt$/ { printf("%s %04d.txt\n", $0, $1) }' | xargs -n2 mv
    

    如何使用grep只匹配包含\d.txt的行(即1个数字,然后是句点,然后是字母txt)?

    grep -E '^[0-9]\.txt$'
    
        5
  •  4
  •   Peter Mortensen Mohit    7 年前

    假设您的文件夹中有数据类型为.dat的文件。把这个代码复制到一个名为运行.sh,通过运行 chmode +x run.sh 然后使用 ./run.sh :

    #!/bin/bash
    num=0
    for i in *.dat
    do
    
      a=`printf "%05d" $num`
      mv "$i" "filename_$a.dat"
      let "num = $(($num + 1))"
    done
    

    这会将文件夹中的所有文件转换为 filename_00000.dat , filename_00001.dat

        6
  •  1
  •   rindeal    7 年前

    此版本还支持处理数字之前(之后)的字符串。但基本上你可以做任何正则表达式匹配+printf只要你的awk支持它。而且它还支持文件名中的空白字符(除了换行符)。

    for f in *.txt ;do
        mv "$f" "$( 
            awk -v f="$f" '{
                if ( match(f, /^([a-zA-Z_-]*)([0-9]+)(\..+)/, a)) {
                    printf("%s%04d%s", a[1], a[2], a[3])
                } else {
                    print(f)
                }
            }' <<<''
        )"
    done
    
        7
  •  0
  •   LukeN    14 年前

    要只匹配一位数的文本文件,您可以。。。

    $ ls | grep '[0-9]\.txt'
    
        8
  •  0
  •   Peter Mortensen Mohit    7 年前

    while [ -f ./result/result`printf "%03d" $a`.txt ]; do a=$((a+1));done
    RESULT=result/result`printf "%03d" $a`.txt
    
        9
  •  0
  •   Charles Duffy    7 年前

    要提供一种即使在存在带空格的文件名的情况下也要谨慎编写为正确的解决方案,请执行以下操作:

    #!/usr/bin/env bash
    
    pattern='%04d'  # pad with four digits: change this to taste
    
    # enable extglob syntax: +([[:digit:]]) means "one or more digits"
    # enable the nullglob flag: If no matches exist, a glob returns nothing (not itself).
    shopt -s extglob nullglob
    
    for f in [[:digit:]]*; do               # iterate over filenames that start with digits
      suffix=${f##+([[:digit:]])}           # find the suffix (everything after the last digit)
      number=${f%"$suffix"}                 # find the number (everything before the suffix)
      printf -v new "$pattern" "$number" "$suffix"  # pad the number, then append the suffix
      if [[ $f != "$new" ]]; then                   # if the result differs from the old name
        mv -- "$f" "$new"                           # ...then rename the file.
      fi
    done
    
        10
  •  0
  •   Nico Rodsevich    5 年前

    有一个 rename.ul 命令安装自 util-linux 包(至少在Ubuntu中)默认安装。

    它的用途是(做一个男人)重命名.ul):

    重命名[options]表达式替换文件。。。

    该命令将替换 expression 与给定的 replacement 对于提供的文件。

    形成命令时,您可以使用:

    rename.ul -nv replace-me with-this in-all?-these-files*
    

    不做任何更改,但读取该命令将进行的更改。如果确定,只需重新执行命令而不使用-v(verbose)和-n(no act)选项

    rename.ul "" 000 ?.txt
    rename.ul "" 00 ??.txt
    rename.ul "" 0 ???.txt