2013-09-21 64 views
0

我在一個目錄多個文件命名,如:重命名多個 「STR1 - str2.txt」 文件 「STR2 - str1.txt」

str1 - str2.txt 

如何在bash它們重命名爲:

str2 - str1.txt 
  • str1 - 是一個字符串,其中包含字母數字字符,空格以及某些情況下的一個或多個-字符。
  • str2 - 是一個只包含字母數字字符的字符串。

我可以使用rename 'y/str1 - str2/str2 - str1/' *命令逐個重命名它們,但是我想找到一個合適的正則表達式來在同一時間重命名所有文件。

回答

3

試試這個。我使用sed來生成要運行的命令列表。您可以將其捕獲到一個文件中並執行該文件。

ls | sed 's/\(.*\) - \([A-Za-z0-9_]*\)\.txt/mv "\1 - \2.txt" "\2 - \1.txt"/g' \ 
    | grep "^mv" > mv_commands 
## Verify that the correct mv commands were generated in the "mv_commands" file 
sh commands 
+0

沒有得到你。你有沒有嘗試以上?你有什麼輸出? '\ 1'和'\ 2'表示正則表達式匹配組,不是實際的'1'和'2'。如果它不起作用,你可以舉一些它不起作用的例子嗎? –

+0

不錯的答案,它解決了我的問題。 –

+1

某些「prankster」會在該目錄中刪除一個名爲'mv; rm -rf〜'的文件,您可能會遇到麻煩。你想'sed -nr'/ ^([[:alnum:]] *) - ([[:alnum:]] *)\ .txt $/s // mv \ 2 \ 1.txt/p'',如果沒有別的,因爲這是一個不好的習慣,讓你的警衛這樣下去。 – jthill

1

要使用腳本,重命名的所有文件在當前目錄

list=`ls *-*.txt` 

for files in $list 
do 
    mv $files `echo "$files" | awk -F '.' '{print $1}' | gawk '{match($0, /([^-]*) 
    (-+)(.*)/, a); print a[3],a[2],a[1]".txt"}' | tr -d [:space:]` 
done 
2

真棒工具,稱爲mmv可以做這樣的東西

$ touch "str1 - str2.txt" 
$ mmv -v "str* - str*.txt" "str#2 - str#1.txt" 
str1 - str2.txt -> str2 - str1.txt : done 
$ ls -l 
total 0 
-rw-r--r-- 1 hashier wheel 0 Sep 21 20:05 str2 - str1.txt 
$ 
當然

你需要一點適應它您的需求,但mmvmcp ......真的強大

相關問題