2017-02-21 75 views
0

我的圖片保存有圖像的日期爲文件夾名稱的文件夾中,例如原來的路徑和文件名:如何批量重命名多個圖像及其路徑名和bash中的重新排序序列?

.../Pics/2016_11_13/wedding/DSC0215.jpg 
.../Pics/2016_11_13/afterparty/DSC0234.jpg 
.../Pics/2016_11_13/afterparty/DSC0322.jpg 

如何重新命名的圖片轉換成下面的格式,具有連續序列和4數字填充?

.../Pics/2016_11_13_wedding.0001.jpg 
.../Pics/2016_11_13_afterparty.0002.jpg 
.../Pics/2016_11_13_afterparty.0003.jpg 

我使用Bash 4.1,所以只有mv命令可用。以下是我現在有,但它不工作

#!/bin/bash 

p=0 
for i in *.jpg; 
do 
    mv "$i" "$dirname.%03d$p.JPG" 
    ((p++)) 
done 

exit 0 
+0

並且在原始序列中存在差距cuz我刪除了一些圖片,但最終的圖片序列必須是連續的。 – Armin

+1

你有寫過任何代碼嗎? – codeforester

+0

在這裏搜索'[linux] find xargs mv printf'。你應該找到很多可以幫助你解決問題的例子。您需要在知道如何評估佔位符('printf')的程序中使用'%04d'。你需要輸出一個命令並用'$(printf ....)'將它替換成你的真實命令(cmd-substition)。祝你好運。 – shellter

回答

1

讓說,你有什麼樣... /照片管理/ 2016_11_13 /婚慶/ XXXXXX.jpg;然後進入目錄.../Pics/2016_11_13;從那裏,你應該有一大堆像婚禮,派對等等的子目錄。啓動這個腳本(聲明:我沒有測試):

#!/bin/sh 
for subdir in *; do    # scan directory 
    [ ! -d "$subdir" ] && continue; # skip non-directory 
    prognum=0;      # progressive number 
    for file in $(ls "$dir"); do  # scan subdirectory 
    ((prognum=$prognum+1))   # increment progressive 
    newname=$(printf %4.4d $prognum) # format it 
    newname="$subdir.$newname.jpg" # compose the new name 
    if [ -f "$newname" ]; then  # check to not overwrite anything 
     echo "error: $newname already exist." 
     exit 
    fi 

    # do the job, move or copy 
    cp "$subdir/$file" "$newname" 

    done 
done 

請注意,我跳過了「日期」(2016_11_13)的一部分 - 我不知道這件事。如果你有一個日期,那麼很容易在#中添加這些數字,組成新名稱。如果您有多個日期,則可以添加嵌套for以掃描「日期」目錄。還有一個原因,我跳過這一點,是讓你自己開發的東西,有些東西你可以自豪......

0

只使用mv和bash內建的:

#! /bin/bash 

shopt -s globstar 
cd Pics 
p=1 
# recursive glob for .jpg files 
for i in **/*.jpg 
do 
    # (date)/(event)/(filename).jpg 
    if [[ $i =~ (.*)/(.*)/(.*).jpg ]] 
    then 
     newname=$(printf "%s_%s.%04d.jpg" "${BASH_REMATCH[@]:1:2}" "$p") 
     echo mv "$i" "$newname" 
     ((p++)) 
    fi 
done 

globstar是一個bash 4.0功能,即使在OSX的anitque bash中也可以使用正則表達式匹配。