Bash:文件名中的零填充任意数量的“数字”

时间:2014-04-18 09:17:06

标签: bash shell rename

我有100个子目录,其中包含100个文件,每个文件的文件名(可能)都有需要填充零的数字。

我找到了在表单文件名中填充1个数字的解决方案:

    file1.txt -> file001.txt

但我的情况稍微复杂一点。

但在我的情况下:

  • 文件名可能包含多个号码。所有号码都必须填上。
  • 文件名可能包含空格。
  • 某些文件名可能不需要任何填充。

例如:

    "v10 file p1-2.txt"      -> "v010 file p001-002.txt"
    1.txt                    -> 001.txt
    "v011 file p001-002.txt" -> do nothing
    002.txt                  -> do nothing

所以我需要一个“通用”bash循环来重命名(如果需要)子目录中的所有文件,其所有数字都填零,但我不确定如何实现这一点。

我在填充文件名中的一个数字时没有找到任何帮助。

提前谢谢。

编辑1:

实际上,这是执行更多处理的更大脚本的一部分,但到目前为止,这就是我正在使用的内容:

#!/bin/bash
mkdir ../test
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
for file in ./*
do
    cd ${file}
    ls *
    # do something
    # mv "something" to ../../test
    cd ..
done
IFS=$SAVEIFS

退出0

问题是,如果存在未填充的文件名,“执行某些操作”将无法按预期执行(结果会以随机页面结束)。

对于简单的填充情况有很多解决方案,现在我正在看:

解决方案表单http://www.walkingrandomly.com/?p=2850

#!/bin/bash
# zeropad.sh
num=`expr match "$1" '[^0-9]*\([0-9]\+\).*'`
paddednum=`printf "%03d" $num`
echo ${1/$num/$paddednum}

然后在“做某事”之前插入

for i in *.*; do mv $i `./zeropad.sh $i`; done

但我知道这个解决方案可能并不完美,可能不会延伸到我的目的。

编辑2:

我的问题的解决方案是:

perl -pe 's{([^0-9]+)?([0-9]+)}{$1 . sprintf("%03s",$2)}ge'

1 个答案:

答案 0 :(得分:1)

根据我与案例相关联的问题调整sed解决方案可以这样做:

sed -r ':r;s/([^0-9]|^)([0-9]{1,2})([^0-9]|$)/\10\2\3/g;tr' file_list
v010 Cover.jpg
v010 End.jpg
v010 p000.jpg
v010 p010-011.jpg
v010 p012-013.jpg
v010 p014-015.jpg
v010 p016-017.jpg
v010 p018-019.jpg
v010 p019;TN.jpg
v010 p001.jpg
v010 p002-003.jpg
v010 p004-005.jpg
v010 p006-007.jpg
v010 p008-009.jpg