使用"cat"作为包含空格的文件名



我想在这里替换"cat",这样源代码中的行项目就可以有空格,使这个Rsync脚本更具可移植性(在OSX中)。

你们这些专家能建议一下做这件事的方法吗?其他改进建议也很感激!谢谢

Dan

#!/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

不要使用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

用引号括起文件名:

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

类似地,当您执行rsync:时

rsync $options "$source" "$destin"

报价总是个好主意。

这是为感兴趣的人完成的工作脚本:

#!/bin/bash
PATH=/bin:/usr/bin:/sbin:/usr/sbin export PATH
EMAILSUBJ="Rsync Results"
EMAILRECIP="admin@example.com"
EMAILSENDER="admin@example.com"
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

最新更新