2011-12-28 51 views
2

我正在用大量jpgs進行大量目錄的重大重構,其中一些與其他目錄中的文件具有相同的名稱。我想將文件移動/複製到備用目錄,並且如果名稱與該目錄中的另一個文件相匹配(重命名爲IMG_238.jpgIMG_238_COPY1.jpgIMG_238_COPY2.jpg等),而不是覆蓋現有文件,bash會自動重命名它們。在bash中移動文件並自動重命名複製文件而不覆蓋現有文件的方式

我已經設置了一個腳本,它需要jpegs並將它們移動到基於exif數據的新目錄中。移動一個jpg的腳本的最後一行是:mv -n "$JPEGFILE" "$DIRNAME"

我正在使用-n選項,因爲我不想覆蓋文件,但現在我必須去手動排序,不會被移動/複製。我的GUI自動執行此操作...是否有一種相對簡單的方法在bash中執行此操作?

(萬一它很重要,我在Mac OSX Lion中使用bash 3.2)。

+0

你正在使用什麼發行版,還是需要跨發行版? – 2011-12-28 13:45:48

+0

我用bash 3.2使用Mac OSX Lion。我會更新我的問題。 – 2011-12-28 13:47:55

+2

你可能想看看[fdupes](http://premium.caribe.net/~adrian2/fdupes.html) - 它可以幫助你擺脫重複文件,所以你留下的任何文件「unmoved 「由於相同的名稱是真正不同的文件。 – holygeek 2011-12-28 14:29:52

回答

4

這應該做到這一點

# strip path, if any 
fname="${JPEGFILE##*/}" 
[ -f "$DIRNAME/$fname" ] && { 
    n=1 
    while [ -f "$DIRNAME/${fname%.*}_COPY${n}.${fname##*.}" ] ; do 
     let n+=1 
    done 
    mv "$JPEGFILE" "$DIRNAME/${fname%.*}_COPY${n}.${fname##*.}" 
} || mv "$JPEGFILE" "$DIRNAME" 

編輯:改進。

+0

您可以放心地刪除第一個''[-f「$ DIRNAME/$ JPEGFILE」]'' – holygeek 2011-12-28 14:05:59

+0

您也可以安全地刪除拖尾或「'||」 mv「$ JPEGFILE」...'' – holygeek 2011-12-28 14:06:36

+0

也把''done && mv''改成''完成; mv'' – holygeek 2011-12-28 14:07:47

2

您可以試試downloading並查看Ubuntu/Debian的基於Perl的rename是否有效。它具有sed型功能。答曰手冊頁(我的系統上,但腳本應該是相同的一個爲鏈接):

「重命名」指定 作爲第一個參數重命名根據規則提供的文件名。 perlexpr參數是一個Perl表達式 ,預計它將在Perl中修改$ _字符串,至少可以指定一些 文件名。如果給定的文件名沒有被 表達式修改,它將不會被重命名。如果 命令行上沒有給出文件名,則將通過標準輸入讀取文件名。

例如,重命名匹配「名爲* .bak」剝去 擴展名的文件,你可能會說

rename 's/\.bak$//' *.bak 

要大寫名稱更低翻譯,你會使用

rename 'y/A-Z/a-z/' * 
+0

謝謝 - 我會檢查出來的。 – 2011-12-28 15:33:54