我有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'
答案 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