2014-04-18 28 views
1

我有100個子目錄,每個文件名(可能)都有數字,需要填零。Bash:文件名中零填充任意數量的「數字」

我已經找到了填充1號方案形式的文件名:

file1.txt -> file001.txt 

但我的情況比較複雜一點。

但在我的情況:

  • 文件名可能有超過1個號碼。所有數字都必須填充。
  • 文件名可能包含空格。
  • 某些文件名可能不需要任何填充。

例如:

"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

展我們將你的'file1.txt'轉換爲'file001.txt'的解決方案,我們會盡量幫助你將其擴展到其他形式。 – devnull

+0

只是一個念頭:這可能會更容易做到與Ruby或Python等錯誤的機會較少。 –

+0

我會打開一個解決方案在Python或Ruby。我只是不懂這些編程語言。我剛剛說過Bash,因爲我認爲它可能很簡單,我可以稍後將其與腳本的其餘部分整合。 – user3548276

回答

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