2016-07-25 56 views
-3

我有一大堆文件的名稱,比如這個如何交換文件名兩個部分組成

name-id.ext 

,我希望交換的編號和名稱的文件中,以便它們被命名爲

id-name.ext 

這似乎是工作,唯一的問題是,它也交換了文件擴展

for file in *; do echo "${file#*-}-${file%-*}"; done 
+0

我我一直在努力尋找各種各樣的東西,這是迄今爲止所提出的,我認爲應該工作,但不要這樣做,因爲它存在於*中;做回聲「$ {file% - *} - $ {file#* - }」;完成 –

+2

請編輯您的答案以添加您的代碼,而不是添加評論。這樣你可以格式化它,並使其更易於閱讀。你也不會強迫人們試圖幫助你挖掘一堆評論,並拿起信息。 – Robert

+1

你的'$ {file% - }'等看起來大致正確。在針對所有文件運行之前,是否讓它爲1個文件工作?您是否掃描了您的文件以確定它們的名稱中沒有空格或ctrl-chars,並且您可以合理地期望您的解決方案適用於所有文件?將來,請務必在您的Q **的主體中包含您嘗試過的代碼**,這樣人們就不必閱讀每一條不斷增長的評論鏈。祝你好運! – shellter

回答

3

這可以實現使用的組合:

  • 正則表達式組來檢測所述文件名的兩個部分被交換: sed 's/^\(.*\)-\(.*\)\.ext$/\2-\1\.ext/'

  • echo到管: '^(.*)-(.*)\.ext'

  • sed與第二部分交換的第一部分將舊文件名轉換爲sed:echo $file | sed 's/^\(.*\)-\(.*\)\.ext$/\2-\1\.ext/'

  • 將其存儲在一個變量中:newname=$(echo $file | sed 's/^\(.*\)-\(.*\)\.ext$/\2-\1\.ext/')
  • mv可以使用塊從以前的點作爲新的名稱:mv $file $newname

  • 整個事情都可以被包裝在一個循環中走了過來文件:

    for file in *ext; do newname=$(echo $file | sed 's/^\(.*\)-\(.*\)\.ext$/\2-\1\.ext/'); mv $file $newname; done;

+0

這個工作完美!謝謝! –