2013-08-06 43 views
0

我想,以取代‘貓’這裏這麼源的訂單項可以有空格,使這個Rsync的腳本更便攜(在OSX)。使用「貓」到文件名包含空格

?各位高手可否請您建議如何做到這一點的其他建議,以改善這也不勝感激謝謝

#!/bin/bash  
PATH=/bin:/usr/bin:/sbin:/usr/sbin export PATH 

LOG="/Users/jdoe/Desktop/rsync-`/bin/date +%m%d%Y`.log" 
EXCLUDE="/tmp/exclude.dat" 


{ 
echo "-----------------------------------------------" 
echo "Start:" $0 
echo "-----------------------------------------------" 
date "+%a %m-%d-%y %H:%M:%S" 
echo "-----------------------------------------------" 

options="-aNHxEh --delete --fileflags --exclude-from=$EXCLUDE --delete-excluded --force-change --progress --stats --protect-args" 

destin='/Users/jdoe/Desktop/DEST/' 

for source in $(cat /tmp/list.dat) 
    do 

    echo "Source:  " $source 
    echo "Destination: " $destin 

    echo "rsync" $options $source $destin 
    /opt/local/bin/rsync $options $source $destin 

    retcode=$? 
     if [ $retcode -gt 0 ] 
       then 
       echo "ERROR: rsync " $source "failed with code " $retcode 
       fi 

echo "-----------------------------------------------" 
date "+%a %m-%d-%y %H:%M:%S" 
echo "-----------------------------------------------" 

done 

echo "-----------------------------------------------" 
echo "End:" $0 
echo "-----------------------------------------------" 

} >> $LOG 2>&1 


exit 0 
+0

考慮使用一個數組來保存你的選擇:http://mywiki.wooledge.org/ BashFAQ/050 - 只要情況稍微複雜一點,你就會開始分解。 –

+0

是的,這是一個很好的建議,也是我剛剛實施的一個建議。感謝您指出了這一點! – Dan

回答

2

請勿使用cat;使用while循環與read

while read -r source; do 
    echo "Source:  $source" 
    echo "Destination: $destin" 
    echo "rsync" $options $source $destin 
    if ! /opt/local/bin/rsync $options "$source" "$destin"; then 
     echo "ERROR: rsync $source failed with code $?" 
    fi 

    echo "-----------------------------------------------" 
    date "+%a %m-%d-%y %H:%M:%S" 
    echo "-----------------------------------------------" 

done < /tmp/list.dat 
+0

啊,這似乎現在工作。謝謝!我在錯誤的地方完成了......乾杯! – Dan

2

用引號括文件名:!

cat "/tmp/path/file with spaces.txt" 

同樣,當你這樣做的rsync:

rsync $options "$source" "$destin" 

行情總是一個好主意。

+0

我想他在詢問'/ tmp/list.dat'中包含的文件名是否有空格,而不是正在讀取的文件名。 – chepner

+0

啊。那麼,他的'rsync'中仍然需要引用'$ source'。 – PaulProgrammer

0

下面是對於那些有興趣完成的,工作的腳本:

#!/bin/bash 

PATH=/bin:/usr/bin:/sbin:/usr/sbin export PATH 

EMAILSUBJ="Rsync Results" 
EMAILRECIP="[email protected]" 
EMAILSENDER="[email protected]" 
LOG="/Users/jdoe/Desktop/rsync-`/bin/date +%m%d%Y`.log" 
EXCLUDELIST="/tmp/exclude.dat" 
SOURCEFILE="/tmp/list.dat" 
DESTINATION='/Users/jdoe/Desktop/DEST/' 
RSYNC=/opt/local/bin/rsync 
# Rsync options below: 
ROPTIONS=(
    -aNHxEh 
    --delete 
    --fileflags 
    --exclude-from=$EXCLUDELIST 
    --delete-excluded 
    --force-change 
    --stats 
    --protect-args 
    ) 
# Get started 
{ 
echo "-----------------------------------------------" 
echo "Start:" $0 
echo "-----------------------------------------------" 
date "+%a %m-%d-%y %H:%M:%S" 
echo "-----------------------------------------------" 

while IFS= read -r SOURCE; do 


    echo "SOURCE: $SOURCE" 
    echo "DESTINATION: $DESTINATION" 

    echo "rsync" "${ROPTIONS[@]}" $SOURCE $DESTINATION 
    $RSYNC "${ROPTIONS[@]}" "$SOURCE" "$DESTINATION" 

    RETCODE=$? 
     if [ $RETCODE -gt 0 ] 
       then 
       echo " " 
       echo "##########################################################" 
       echo "ERROR: rsync " $SOURCE "FAILED with code " $RETCODE 
       echo "##########################################################" 
       echo " " 
       fi 

echo "-----------------------------------------------" 
date "+%a %m-%d-%y %H:%M:%S" 
echo "-----------------------------------------------" 

done < $SOURCEFILE          

echo "-----------------------------------------------" 
echo "End:" $0 
echo "-----------------------------------------------" 



} >> $LOG 2>&1 

# Send an email 
(
echo "From: $EMAILSENDER" 
echo "To: $EMAILRECIP" 
echo "Subject: $EMAILSUBJ" 
cat $LOG 

) | /usr/sbin/sendmail -it 

exit 0 
相關問題