2012-08-04 53 views
21

使用正則表達式的文件我有一組命名爲喜歡的文件:重命名在Linux

Friends - 6x03 - Tow Ross' Denial.srt 
Friends - 6x20 - Tow Mac and C.H.E.E.S.E..srt 
Friends - 6x05 - Tow Joey's Porshe.srt 

,我想他們像下面

S06E03.srt 
S06E20.srt 
S06E05.srt 

我應該怎麼做才能使工作重新命名在linux終端完成? 我已經安裝了重命名但你用得到錯誤如下:

rename -n 's/(\w+) - (\d{1})x(\d{2})*$/S0$2E$3\.srt/' *.srt 

回答

35

您在星號的前面忘了點:

rename -n 's/(\w+) - (\d{1})x(\d{2}).*$/S0$2E$3\.srt/' *.srt 

在openSUSE,紅帽,Gentoo,你必須使用的Perl版本renameThis answer顯示如何獲取它。在Arch上,這個軟件包被稱爲perl-rename

+2

OpenSUSE,RedHat,Gentoo不支持regex in'rename' – mmrmartin 2016-12-15 18:32:08

+0

@mmrmartin:這裏使用的重命名腳本是Larry Wall編寫的。它用在'/ usr/bin/rename'文件中,但可能它已經被重命名了(沒有雙關語意思)?在Debian上,腳本名稱現在是'/ usr/bin/file-rename'。 – Thor 2016-12-15 18:42:21

+1

openSUSE使用'util-linux'軟件包重命名,我沒有發現任何提供'file-rename','prename'或'perl-rename'的軟件包 - 只有工作解決方案是[使用cpan安裝](http:// stackoverflow.com/a/32862278/1392034)。 – mmrmartin 2016-12-15 19:26:16

7

並非每個發行版都提供支持上述示例中使用的正則表達式的rename實用程序 - RedHat,Gentoo及其衍生產品等。

嘗試使用的替代品是perl-renamemmv

0

可以使用rnm

rnm -rs '/\w+\s*-\s*(\d)x(\d+).*$/S0\1E\2.srt/' *.srt 

說明:

  1. -rs:替換形式的字符串/search_regex/replace_part/modifier
  2. (\d)(\d)x(\d+)(\d+)爲(分別\1\2)兩個所俘獲groupes 。

更多示例here

4

編輯:找到一種更好的方式列出文件,而無需使用IFSls同時仍然sh標準。

我爲做一個shell腳本:

#!/bin/sh 
for file in *.srt; do 
    if [ -e "$file" ]; then 
    newname=`echo "$file" | sed 's/^.*\([0-9]\+\)x\([0-9]\+\).*$/S0\1E\2.srt/'` 
    mv "$file" "$newname" 
    fi 
done 

前面的腳本:

#!/bin/sh 
IFS=' 
' 
for file in `ls -1 *.srt`; do 
    newname=`echo "$file" | sed 's/^.*\([0-9]\+\)x\([0-9]\+\).*$/S0\1E\2.srt/'` 
    mv "$file" "$newname" 
done 
+0

在這個例子中,IFS ='\ n''代表什麼?我喜歡它,因爲它沒有使用任何特殊的東西。 – Szobi 2017-06-16 11:25:40

+0

IFS:擴展後用於分詞的內部字段分隔符,以及使用讀取內置命令將行拆分爲單詞的內部字段分隔符。默認值是「」 - (來自man bash)。 將其更改爲'\ n'允許每行獲取一個文件。 – Creak 2017-06-17 16:36:47

0

如果你的Linux沒有提供重命名,你也可以使用如下:

find . -type f -name "Friends*" -execdir bash -c 'mv "$1" "${1/\w+\s*-\s*(\d)x(\d+).*$/S0\1E\2.srt}"' _ {} \; 

我經常使用這個片段來在我的控制檯中用正則表達式替換。

我不是在殼的東西非常好,但據我理解這段代碼,它的解釋是這樣的:的搜索結果中的找到將上一個bash命令(慶典傳遞 - c)其中您的搜索結果將作爲源文件在$ 1之內。接下來的目標是一個子shell內的替換,結果其中$ 1內容(這裏只是您的參數substituion內{ //查找/替換})也將是你的搜索結果。在{}其傳遞給的-execdir

更好的解釋內容,將不勝感激了很多:)

請注意:我只是複製粘貼你的正則表達式;請先用示例文件進行測試。根據您的系統,您可能需要將\ d和\ w更改爲字符類,如[[:digit:]]或[[:alpha:]]。然而,\ 1應該爲這些團體工作。

1

mmv很簡單但有用。它對任何字符串使用*,對匹配字符串中的任何字符使用?,對替換字符串使用#X來引用第X次匹配。

在你的情況:

mmv 'Friends - 6x?? - Tow *.srt' 'S06E#1#2.srt' 

這裏#1#2表示其通過??(匹配#1和#2)拍攝到的兩位數字。

mmv也提供匹配[];,請閱讀手冊頁獲取更多信息!

1

真的很酷lil diddy。

xargs -n2可以在每行打印兩個參數。當與Perl的print $_(首先打印$ STDIN)結合使用時,它將成爲一個強大的重命名工具。 perl -pe 'print $_; s/OldName/NewName/' | xargs -n2最終被的

find . -type f | perl -pe 'print $_; s/DVDCover/DVDCoverLabel/' | xargs -n2 mv 

結果:

OldName.ext NewName.ext 
OldName.ext NewName.ext 
OldName.ext NewName.ext 
OldName.ext NewName.ext 

我沒有Perl的rename一應俱全我的系統上。