2014-02-07 264 views
1

我已經使用該命令重命名多個目錄中的文件並將JPG更改爲jpg,因此我具有一致性。在Linux中重命名文件時包含文件夾名稱

find . -name '*.jpg' -exec sh -c 'mv "$0" "${0%.JPG}$.jpg"' {} \; 

你有任何想法如何改變這種狀況,包括在文件

我執行的是一個包含約2000文件夾中的文件夾(SKU的)或產品的名稱的文件夾名稱.. 。在每個SKU文件夾內,有9個圖像。 1.jpg 2.jpg .... 9.jpg。

所以底線是我有2000圖像,名稱爲1.jpg,2.jpg ... 9.jpg。我需要這些文件是唯一的,例如:

folder-name-1.jpg ... folder-name.2.jpg ...等等,在每個文件夾中。

任何幫助將不勝感激。

+1

將'1.jpg'重命名爲'folder-name-1.jpg'並不會使__unique__。你基本上試圖爲所有文件名添加_prefix_。 – devnull

+0

如果您自己創建了這個命令,那很簡單..停止使用網絡中的代碼片段。這很危險 – hek2mgl

+0

Perl分發中的'rename'可能會有幫助。 – devnull

回答

0

例如,我可以做如下:

$ find . -iname '*.jpg' | while read fn; do name=$(basename "$fn") ; dir=$(dirname "$fn") ; mv "$fn" "$dir/$(basename "$dir")-$name" ;done 
./lib/bukovina/version.jpg ./lib/bukovina/bukovina-version.jpg 
./lib/bukovina.jpg ./lib/lib-bukovina.jpg 
+0

爲了測試它,我嘗試了'find ../D44203 -iname'2.jpg'|同時閱讀fn; do name = $(basename「$ fn」); dir = $(dirname「$ fn」); mv「$ fn」「$ dir/$(basename $(pwd)) - $ name」; done',我得到了所有?A1?PICS?D44203-2.jpg ......這是不正確的,應該是D44203 -2.jpg – pzd060

+0

@ pzd060用新的答案更新 –

+0

@ pzd060'ALL?A1?PICS?D44203-2.jpg ......這是不正確的,應該是D44203-2.jpg'應該是什麼?我不明白。文件之前不需要文件夾? –

0

爲了得到一個文件,你可以做$(basename $(dirname ${FILE})),其中${FILE}是可以相對,但必須包含前至少一個文件夾的路徑的文件夾名稱文件名在裏面。這應該不是find的問題。如果是這樣,只需從一個目錄運行它。

find . -name '*.jpg' -exec sh -c 'mv "$0" "$(basename $(dirname $0))-${0%.JPG}$.jpg"' {} \; 

或者,如果你在你的當前目錄下有JPEG圖片:

find ../<dirname> -name '*.jpg' -exec sh -c 'mv "$0" "$(basename $(dirname $0))-${0%.JPG}$.jpg"' {} \; 
+0

我正在嘗試它在當前目錄(測試目的),當我運行它時,我有 mv:rename ../D44203/9.jpg到D44203 /../ D44203/9.jpg $ .jpg:沒有這樣文件或目錄 – pzd060

+0

@ pzd060。對不起,沒有按照我自己的意見。我只是將斜線改爲破折號。 –

0

可以使用精一行代碼:

find . -name '*.jpg' -execdir \ 
     bash -c 'd="${PWD##*/}"; [[ "$1" != "$d-"* ]] && mv "$1" "./$d-$1"' - '{}' \; 

此命令使用安全的方法來檢查是否映像名稱已經不是當前目錄名稱的前綴。您也可以多次運行它,並且第一次運行後圖像名稱不會重命名。

+0

在我的本地計算機上它工作完美......但是當我在服務器上嘗試時,我得到了mv:無法將'./8.jpg'移動到./D46107-./8.jpg':沒有這樣的文件或目錄' ,你知道爲什麼嗎? – pzd060

+0

你確定你使用'-execdir'而不是'-exec'嗎? – anubhava

+0

當然,我確定,我複製/粘貼了在本地計算機上運行的相同命令。奇怪的是,它在服務器上給出了我在上面給你看的結果。 – pzd060

相關問題