2014-11-02 114 views
0

正如標題所示,我正在尋找一個bash命令(或者甚至是perl命令),我可以在終端中使用它來幫助我重命名文件夾中的文件。Bash終端命令重命名多個文件

我是一名DJ,每週通過一個包含數百種新音樂的zip文件接收音樂,但文件名通常不一致,有時文件在歌曲標題之前有各種字符。我正在尋找在第一個字母之前替換任何字符以及刪除字符串末尾的任何額外空格。

Original < 01 - Artist - Song .mp3 

New > Arist - Song.mp3 

Original < _Artist - Song.mp3 

New > Artist - Song.mp3 

Original < 04 04)(*)*+ Artist - Song.wav 

New < Artist - Song.wav 

我發現了一個正則表達式一個bash幾個月前,處理[0-9]將字符串中的字符前,我已經嘗試了一些事情,但沒有真正的工作,所以我在這裏張貼於看看有人可以幫忙。任何幫助非常感謝,提前致謝!

我嘗試

for f in [0-9]* ; do 
    if[[ $f =~ ^[0-9]+[[:blank:]]+(.+) ]] ; then 
     newname = "${BASH_REMATCH[1]}" 
     echo "> $newname" 
    fi 
done 
+2

嘗試'rename'命令。 – Barmar 2014-11-02 06:34:11

+0

@Barmar什麼是重命名命令? – Chris 2014-11-03 00:56:49

+0

這是一個使用Perl正則表達式重命名文件的腳本。 – Barmar 2014-11-03 01:06:33

回答

1

嘗試在要重命名位於文件的目錄下面的重命名命令。

rename 's/^[^A-Za-z]*([A-Za-z]+) - ([A-Za-z]+)[^.]*/$1 - $2/' *.* 

OR

rename 's/^[^A-Za-z]*|\s+(?=\.[^.]*$)//g' *.* 
+0

第一個給了我:-bash:在意想不到的標記附近的語法錯誤'[A-Za-z] +' – Chris 2014-11-03 00:55:59

+0

第二個給了我:-bash:s/^ [^ A-Za-z] * | \ s +(?= \。[^。] * $)// g:沒有這樣的文件或目錄 – Chris 2014-11-03 00:56:20

+1

@Chris聽起來好像你沒有在第一個參數中加引號。 – Barmar 2014-11-03 01:06:12

1

如何像

sed -r 's/(^[^a-zA-Z]*|\s+)//g' 

每個文件重命名的目錄

for file in *; 
do 
new=`echo $file | sed -r 's/(^[^a-zA-Z]*|\s+)//g'`; 
mv "$file" $new; 
done 
+0

文件可以是各種類型,即.mp3,.wav,.flac,.m4a,.aac,.aiff等。 – Chris 2014-11-03 00:52:24

+0

另外,得到這個:'sed:illegal選項 - r 用法:sed腳本[-Ealn] [-i擴展名] [文件...] sed [-Ealn] [-i擴展名] [-e腳本] ... [-f script_file] .. 。[file ...]' – Chris 2014-11-03 01:04:36

+0

如果要在目錄中重命名整個文件,只需'for file in *'就可以了,這將遍歷direcotry中的所有文件。我編輯了包含該答案的答案。 – nu11p01n73R 2014-11-03 03:40:18

0

您可以輕鬆地調整現有的正則表達式來更新的要求。

if [[ $f =~ ^[^A-Za-z]*(.+[^ ]) *(\....)$ ]] ; then 
    newname="${BASH_REMATCH[1]}${BASH_REMATCH[2]}" 

這假定總是有三個字符的文件擴展名。您可以將第二個加括號的表達式更改爲(\.[A-Za-z0-9]{2,5})之類的內容,以將其限制爲僅字母數字,並允許長度介於2和5個字符之間。

您的代碼無法按照您編寫它的方式工作,因爲它有一些間距錯誤。 if之後的空格很重要,您不能在分配中的等號的兩側留出空格。

+0

if語句給我: '-bash:在條件expression'語法錯誤 '-bash:近'*('' 還要注意,文件名可能多於或少於三成語法錯誤EX:'.aiff','.flac','.rm','.ra'等 – Chris 2014-11-03 00:57:50

0

最後一個看起來很奇怪,除非你的意思是:在第一個短劃線或以數字開頭的下劃線之前剝去任何東西,在括號中可能有一些文本,破折號強調並在藝術家姓名前加上(或不帶)空白。

試試這個: #!/bin/bash for f in [0-9]* ; do echo $f if [[ $f =~ ^([0-9 ]+|[-_\*]+|\(.+\)|[[:blank:]]*)*(.+) ]]; then newname="${BASH_REMATCH[2]}" echo "> ${newname}" fi done

只是讓我們很清楚有,你可以在bash正則表達式做什麼限制。例如所有比賽都是「貪婪」。所以推薦的方法是使用sed,awk或perl來執行此操作。

+0

最後一個顯示的是第一個字符是否是一個字母字符,並刪除所有字符有一個字母字符 – Chris 2014-11-04 19:31:06

+0

我從來沒有用過sed,awk或perl,你會推薦哪三種,我該怎麼做呢? – Chris 2014-11-04 19:31:42