2015-08-14 18 views
0

我已經編寫了一個腳本,將從Dropbox中獲取種子文件,將它們添加到傳輸並將該種子移動到另一個位置。腳本正在爲我工​​作,只要我一次只將一個文件放在一個文件夾中。如果我在文件夾中有多個文件,它會給我一個關於文件路徑太長的錯誤。任何人都可以從我的腳本中知道我做錯了什麼,以及如何改變它,以便它可以正確處理多個文件?這是Mac上的bash腳本,通過launchd每60秒執行一次。我在做什麼錯誤,我的循環正在處理整個目錄列表,而不是每個單獨的文件名?

謝謝!

#!/bin/bash 
# Log to debug file 
set –xv; exec 1>>/Users/admin/TorrentMoverLog.txt 2>&1 
date 
################################################### 
###            ### 
###    Torrent Mover v.0.1   ### 
###            ### 
################################################### 

################# Variables ##################### 
################################################### 
######## Watch Folders       ## 
##            ## 
WATCH_PATH=/Users/admin/Dropbox/Torrent-Drop/ 
WATCH_FOLDERS=(Movies/ TV/ Music/ FLAC/ Software/ Other/) 
##            ## 
######## DL Folders        ## 
##            ## 
DL_PATH=/Volumes/Media/ 
##            ## 
################################################### 


################ Functions ###################### 
################################################### 
##            ## 
function add_torrent { 
    /usr/local/bin/transmission-remote -a "$1" -w "$2""$3" 
} 
##            ## 
################################################### 

################### Script ###################### 
##            ## 
## Rename files with spaces 
echo "Renaming files with spaces" 
find "$WATCH_PATH" -depth -name "* *" -execdir rename 's/ /_/g' "{}" \; 

## Start Outer Loop 
## Process Watch Folders 
for wf in "${WATCH_FOLDERS[@]}" 
do 
    WF_LIST=`ls $WATCH_PATH${wf} | grep torrent` 
    ## Check for torrent files first, skip if none found 
    if [ "$WF_LIST" != "" ]; then 
     echo "Processing ${wf} folder..." 
     ## Start Inner Loop 
     ## Process Files within watch folders 
     ## Set download folder 
      for torrent in "$WF_LIST"; 
      do 
       case "${wf}" in 

       Movies/) echo "Movies variable set" 
        DL_FOLDER=Movies/ ;; 

       TV/) echo "TV variable set" 
        DL_FOLDER=TV_Shows/ ;; 

       Music/) echo "Music variable set" 
        DL_FOLDER=Music/ ;; 

       FLAC/) echo "FLAC variable set" 
        DL_FOLDER=PlexMusic/ ;; 

       Software/) echo "Software variable set" 
        DL_FOLDER=Software/ ;; 

       Other/) echo "Other variable set" 
        DL_FOLDER=Other/ ;; 

       esac 
       ## Add torrent to transmission 
       echo "Running command, add_torrent $WATCH_PATH${wf}$torrent $DL_PATH $DL_FOLDER" 
       add_torrent "$WATCH_PATH${wf}$torrent" "$DL_PATH" "$DL_FOLDER" 
       ## Move torrent 
       echo "Moving $WATCH_PATH${wf}$torrent to $DL_PATH""TorrentFiles/" 
       mv "$WATCH_PATH${wf}$torrent" "$DL_PATH""TorrentFiles/" 
      done 
     ## End Inner Loop 
     echo "Finished processing torrents in ${wf} folder." 
    else 
     echo "Skipping ${wf} directory, no torrents found." 
    fi 
done 
## End Outer Loop 

exit 0 
+1

在腳本**中使用'ls'是錯誤的。請參閱http://mywiki.wooledge.org/ParsingLs –

+0

...和btw,使用'功能'關鍵字是不好的形式。 'add_torrent(){...}',沒有'function',是定義shell函數的POSIX兼容方式。 –

+1

你必須小心地用空格重命名任何文件,但是你在''WF_LIST「'而不是'$ WF_LIST'上迭代,所以'torrent'只設置爲一個值,所有文件的空格分隔列表,而不是一次一個文件。但請注意,空白不是避免分析'ls'輸出的唯一原因。 – chepner

回答

0

你做錯了什麼是trying to parse ls而不是使用glob表達式。

shopt -s nullglob # make globs return empty set on failure to match 
for torrent in "$WATCH_PATH/$wf"/*torrent*; do 
    echo "Found $torrent" 
done 

...或者,存儲水珠導致數組:

shopt -s nullglob # can just put this once at the top of your script 
wf_list=("$WATCH_PATH/$wf/"*torrent*) 
echo "Found ${#wf_list[@]} torrents:" 
for torrent in "${wf_list[@]}"; do 
    printf '- %q\n' "$torrent" 
done 

如果你把引號關 - for torrent in $WF_LIST - 這將使字符串分裂並在ls的輸出上進行glob擴展,但是這本身就是bug(用空格打破文件名,破壞可以被解釋爲glob擴展的文件名等)。不要這樣做。

+0

這個伎倆!非常感謝! – Tk4two1

相關問題