2014-10-07 51 views
0

我目前正在使用格式文件名。下面我有一個while循環,它貫穿文件名並用_替代空格,並在連字符後保留任何東西。現在,問題正在循環通過find命令的結果來格式化名稱。在腳本運行這個了就把如下:雖然通過文件名循環並刪除空白空間

find: paths must precede expression: rename 
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression] 

rename.sh

while read -r file 
do 
    new_file=$(echo "$file" | sed -re 's/^([^-]*)-\s*([^\.]*)/\L\1\E-\2/' -e 's/ /_/g' -e 's/_-/- 

/g') 
     echo "mv '$file' '$new_file'" 
    done < <(find ./ -type f rename) 

文件名前:

'./My File - KeEp.txt' 

文件名後:

'./my_file-KeEp.txt' 
+0

什麼位的是你做的Elid用'...'因爲這是腳本錯誤的重要位爲find'抱怨它的參數。 – 2014-10-07 02:41:04

+1

如果你使用'find',你可以給它一個* action *來重命名文件。這樣,你可以避免整個「做...做完<(找到...)'結構。 – Beta 2014-10-07 02:43:00

+0

@EtanReisner,那是我的錯。我糾正了它。 – 2014-10-07 02:47:13

回答

2

你打算什麼rename要做find ./ -type f rename

find是,正如錯誤信息告訴你,將其解釋爲路徑(搜索),然後告訴你在不允許參數後添加路徑。

這就是說,正如@Beta在他的評論中指出的,在這裏使用while循環是不必要的(並且是脆弱的)。

試試這個:

find ./ -type f -exec bash -c 'echo "mv \"$1\" \"$(echo "$1" | sed -re '\''s/^([^-]*)-\s*([^\.]*)/\L\1\E-\2/'\'' -e '\''s/ /_/g'\'' -e '\''s/_-/-/g'\'')\""' - {} \; 

或本真正做到這一點:

find ./ -type f -exec bash -c 'mv "$1" "$(echo "$1" | sed -re '\''s/^([^-]*)-\s*([^\.]*)/\L\1\E-\2/'\'' -e '\''s/ /_/g'\'' -e '\''s/_-/-/g'\'')"' - {} \; 

要解釋一下:

  • '\''位你怎麼逃單在單引號字符串內引用(您結束字符串,轉義單引號並再次啓動字符串)。
  • -- {}是填充$0參數,該參數是與-c和其他參數一起運行時,bash的第一個參數。 (如果沒有,該腳本將需要使用$0,而不是$1訪問的文件名。)

哦,你原來的腳本中使用圍繞你想變量單引號已經擴大,這是行不通的時候你從echo命令中拉出了雙引號。

+0

這更有意義。 +1將它全部集中在一個命令中。現在正在進行更改,但我一直在打開這個'mv:./Thumbs.dbâ和./Thumbs.dbâ是同一個文件' – 2014-10-07 03:02:15

+1

@Code_Ed_Student是的,這將發生在任何沒有改變的文件上。您可以將'$ new_file'變量添加回腳本並進行比較,然後只有在不同的情況下才執行'mv',否則這個消息是「無害的」。 – 2014-10-07 03:03:35

1

我認爲你的主要bug是find命令的「重命名」參數,我不明白你爲什麼把它放在那裏。有幾件事情你也可以改進,例如不要試圖重命名後面有相同名稱的文件,而不是「./」,你可以直接寫「。」。 另請注意,您的腳本不會「在連字符後保留任何內容」,因爲即使在此之後,它也會更改空格,即使在您的示例文件名中也是如此。

我仍然會使用while循環,因爲爲每個重命名生成一個bash + sed可以通過這種方式消除。我使用-name參數進行查找,僅對包含連字符的文件名起作用。

事情是這樣的:

while read -r file; do 
    x="${file%%-*}" # before first hyphen 
    y="${file#*-}" # after first hyphen 
    x="${x,,[A-Z]}" # make it lowercase 
    x="${x// /_}" # change all spaces to underscores 
    new_file="${x}-${y}" 
    if [ "$file" != "$new_file" ]; then 
     echo mv "$file" "$new_file" 
    fi 
done < <(find . -type f -name '*-*') 
+0

我實際上正在重新評估這個答案。它特別希望它在'-'之前和之後去掉空格。例如:'test Text - new - thing.txt'到'test_text-new-thing.txt'。我想通過替換爲'-'來避免多餘的'_-'。 – 2014-10-09 01:54:21