2010-03-10 134 views
4

我想重命名文件編號:我有一個文件'???'我需要把它們放在'????'中。重命名BASH中的幾個文件

myfile_100_asd_4 to myfile_0100_asd_4 

謝謝 阿爾曼。

並非如此優雅的解決方案:

#/bin/bash 
snap=`ls -t *_???` 
c=26 
for k in $snap 
do 

    end=${k} 
    echo mv $k ${k%_*}_0${k##*_}_asd_4 
    ((c=c-1)) 

done 

這對我的作品,因爲我有myfile_100的文件。

回答

5

只是用外殼,

for file in myfile* 
do 
    t=${file#*_} 
    f=${file%%_*} 
    number=$(printf "%04d" ${t%%_*}) 
    newfile="${f}_${number}_${t#*_}" 
    echo mv "$file" "$newfile" 
done 
1

有一個名爲的ren應用程序renmanpage),它支持使用搜索和替換模式重命名多個文件。你應該能夠湊齊一個模式,將額外的0注入文件名。

編輯:項目頁面w /下載鏈接可在Freshmeat找到。

+0

在我的分佈(Mandriva的)我只有你重命名文件之前,這樣,您就可以驗證它工作正常: mren(1) 名稱 mren - 重命名現有的MSDOS文件 沒有人。 – Arman 2010-03-10 11:15:41

+0

我注意到有些發行版似乎並沒有提供它,因此爲什麼我提供了鏈接到Freshmeat頁面並鏈接到源代碼下載。 – slyfox 2010-03-10 11:44:25

8

使用rename,附帶perl的一個小腳本:

rename 's/(\d{3})/0$1/g' myfile_* 

如果你傳遞只打印什麼文件重命名爲會做之前的表達式-n參數,不採取任何行動。

rename -n 's/(\d{3})/0$1/g' myfile_* 
+1

嗯,很遺憾我不能將這個標記爲另一個解決方案:) – Arman 2010-03-10 12:00:15

0

搜索:

for file in `ls my*` 
do 
a=`echo $file | cut -d_ -f1` 
b=`echo $file | cut -d_ -f2` 
c=`echo $file | cut -d_ -f3,4` 

new=${a}_0${b}_${c} 
mv $file $new 
done 
+0

使用shell擴展而不是'ls'。並且shell具有字符串操作功能,所以外部命令實際上不需要。 – ghostdog74 2010-03-10 11:16:09

+0

ghostdog74:你能解釋一下嗎? – Arman 2010-03-10 11:26:02

+0

哇,我從來沒有用過「剪」,它是如此有用:) – Arman 2010-03-10 11:37:18