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'
展我們將你的'file1.txt'轉換爲'file001.txt'的解決方案,我們會盡量幫助你將其擴展到其他形式。 – devnull
只是一個念頭:這可能會更容易做到與Ruby或Python等錯誤的機會較少。 –
我會打開一個解決方案在Python或Ruby。我只是不懂這些編程語言。我剛剛說過Bash,因爲我認爲它可能很簡單,我可以稍後將其與腳本的其餘部分整合。 – user3548276