2011-03-09 37 views
2

中間我有一大堆的文件被命名爲:巴什 - 添加0在文件名

mem0.csv
mem1.csv




mem153.csv


它們都在同一個文件夾中。當我在文件夾中做LS它們出現在

mem0.csv
mem1.csv
mem10.csv
mem100.csv
的順序。


mem2.csv
mem20.csv


我想創建一個bash腳本來在mem和數字之間推0。我想我需要添加0,直到所有文件名的長度相同爲止,問題是我不知道如何執行此操作。

+0

任何特別的原因爲一個bash腳本一個快速和骯髒的方法是什麼? – 2011-03-09 08:03:05

回答

3

可以使用printf的工具,只要確保你的系統有它(幾乎所有的現代系統有它) 要重命名他們都:

for i in {1..153}; do 
    mv mem$i.csv mem`printf "%03d" $i`.csv 
done 

編輯: 對於一個隨機數文件的代碼會變成這樣的事情:

dir = "/somedir" 
fn = $(ls -l $dir | wc -l) 
z = 0; 
c = $fn 
# Count the number of zero's to use 
while [ $c -gt 0 ]; do 
    (($z++)) 
    c = $(($c/10)) 
done 
# Rename the files 
while [ $fn -gt 0 ]; do 
    mv ${dir}/mem$fn.csv ${dir}/mem$(printf "%0${z}d" $i).csv 
    (($fn--)) 
done 
+3

+1但我推薦使用'mv mem $ i.csv mem $(printf「%03d」$ i).csv'作爲反引號不是POSIX並且已被棄用 – SiegeX 2011-03-09 08:09:50

+0

問題是我不知道有多少文件我在我的文件夾中。這意味着我不知道我需要放多少個0。 – Yotam 2011-03-09 09:10:01

+0

在這種情況下,首先對文件數進行計數,並將零的數量放入一個變量中(例如$ z)。然後你可以將它傳遞給命令。 – dtech 2011-03-09 10:12:06

4

由GNU的coreutils提供的ls支持version sort

 
$ ls -v 
mem0.csv 
mem1.csv 
mem2.csv 
... 
mem10.csv 
... 
0

好的。這是我如何做到這一點。我知道這是不是正確的方式,但這種方式有一個機會,我會明白的東西

#Cleaning the dest folder 
cd "out" 
rm * 
cd ".." 

#setting some variables 
MAXLEN=-1 

#Searching for the longest file name 
for f in mem*.csv; do 
    LEN=${#f} 
    if [ $MAXLEN -lt $LEN ]; then 
     let MAXLEN=$LEN 
    fi 
done 

for f in mem*.csv; do 
    LEN=${#f} 
    let LEN+=1 
    COUNT="0" 
    until [ $MAXLEN -lt $LEN ]; do #Creating 0's string to add 
     COUNT=$COUNT"0" 
     let LEN+=1 
    done 
     CLEN=${#COUNT} #The string has one 0 more than it should have. We take that into an account 
     let CLEN-=1 
     echo $CLEN 
     if [ $CLEN != 0 ]; then 
     COUNT=${COUNT:0:$CLEN} #The string is to long, remove the last 0 
     number=$(echo $f | tr -cd '[[:digit:]]') #Extracting the number from the rest of the file name 
     cp $f "out/mem"$COUNT$number".csv" #creating the new file 

else 
     cp $f "out/"$f 
     fi 
done 


ls "out/" 
1

我覺得LS -v(由@ephemient指出的)你想要做什麼,但如果你真的要墊零的數字,這裏的基礎上,提供文件名模式

last=$(ls -v *.csv | tail -n1) # last file has the biggest number 
let max=${#last}-7 # minus the number of all the other chars (constant) 

# below grep gets only the number part and head ignores the last line 
# which we don't need to change 
ls -v mem*.csv | egrep -o '[0-9]+' | head -n -1 | \ 
while read n; do 
    mv -ivf mem$n.csv mem$(printf "%0"$max"d" $n).csv 
done