2012-05-30 41 views
3

我工作的一個bash腳本,將目錄的數組,遍歷它,創建一個名爲「處理」每個目錄中的目錄,並在目錄中的每個文件運行一個命令。這裏是我的代碼(閱讀代碼中的評論,看看我卡住了什麼)。有任何想法嗎?擊:批量調整圖像

#!/bin/bash 

command -v convert >/dev/null 2>&1 || { 
    echo >&2 "Convert is not installed. Aborting."; 
    exit 1; 
} 

declare -a directories_to_process=(
    "$HOME/Desktop/Album 1" 
    "$HOME/Desktop/Album 2" 
    "$HOME/Desktop/Album 3" 
); 

for directory in "${directories_to_process[@]}" 
do 
    if [ -d "$directory" ]; then 
     if [ ! -d "$directory/processed" ]; then 
      mkdir "$directory/processed" 
     fi 

     # Insert code to run the following command on each file in $directory: 
     # 
     # convert $directory/$filename -resize 108x108^ -gravity center -extent 108x108 $directory/processed/$filename 
    fi 
done 

UPDATE:

這裏是工作的腳本:

#!/bin/bash 

command -v convert >/dev/null 2>&1 || { 
    echo >&2 "Convert is not installed. Aborting."; 
    exit 1; 
} 

directories_to_process=(
    "$HOME/Desktop/Album 1" 
    "$HOME/Desktop/Album 2" 
    "$HOME/Desktop/Album 3" 
); 

for directory in "${directories_to_process[@]}" 
do 
    [[ -d $directory ]] || continue 

    mkdir -p "$directory/processed" 

    for infile in "$directory"/*.jpg 
    do 
     outfile="$directory/processed/${infile##*/}" 
     convert "$infile" \ 
       -resize '108x108^' \ 
       -gravity center \ 
       -extent 108x108 \ 
       "$outfile" 
    done 
done 

回答

2

在註釋掉的區域補充一點:

for infile in "$directory"/*; do 
    outfile="$directory/processed/${infile##*/}" 
    convert "$infile" \ 
     -resize '108x108^' \ 
     -gravity center \ 
     -extent 108x108 \ 
     "$outfile" 
done 

其他一些注意事項:

  • 代替嵌套邏輯的一個很大的if [ -d "$directory" ]內的,可以考慮將[[ -d $directory ]] || continue在循環的頂部,以減少嵌套深度。 (與[ ]不同,在這種情況下[[ ]]內部不需要引用)。
  • 使用來決定是否創建目錄測試[ ! -d "$directory/processed" ]相反的,並考慮無條件運行mkdir -p "$directory/processed",這將簡單地,如果該目錄已經存在一個成功的狀態退出。
  • 考慮與type convert,這在一定程度上優於command -v語法知更換command -v convert但也會有同樣的效果。
  • 聲明一個函數外的數組變量時不需要的declare -a;只需directories_to_process=(...)將工作。
+0

引用整個水珠將無法正常工作。將其更改爲'for infile in「$ directory」/ *;做' –

+0

@ DennisWilliamson呃 - 我知道比這更好。謝謝你的收穫。 –

+0

@CharlesDuffy工作!非常感謝您不僅回答我的問題,還提供改進建議。你真棒!請參閱我的問題,瞭解我使用的最終腳本。我堅持使用'command -v',因爲根據[this](http://stackoverflow.com/a/677212/937084),'command'的退出狀態由POSIX定義,因此可能是最安全的使用。 – Nick