我正在编写一个脚本来将客户文件移动到备份服务器。因为这些是客户文件,所以我无法控制它们的命名方式。我们需要能够在处理之前将这些卸载到备份服务器,但到目前为止,脚本在处理名称中包含空格的任何目录或文件时都会遇到问题。我认为这可能是脚本中引用内容的方式,或者它可能是其他内容,但我无法弄明白。我找到了几个有希望的线索,包括:
How to deal with spaces in filenames
How to deal with file name starts with spaces in bash
但是,通过所有这些和其他几个来源,我无法确定如何让它正常工作。代码是:
#! /bin/bash
# Get customer to search
CUSTOMER=$1
# Get destination
DESTINATION_FOLDER=$2
# Get desired older than age
AGE=60 # Age in days
if [[ -d "/home2/$CUSTOMER" ]]; then
cd "/home2/$CUSTOMER"
DEST="$DESTINATION_FOLDER"
if [[ ! -d "$DEST" ]]; then
mkdir -p $DEST
fi
TODAY=`date +%y%m%d`
echo "Starting to move files to $DEST" > /root/logs/${TODAY}archive2log
for DIRCONT in './'*; do
echo "$DIRCONT moving to dataoffload...."
SECONDS=$(($AGE * 3600 * 24)) # Turns days to seconds
FILEAGE=$((`date +%s` - `date -r "$DIRCONT" +%s`))
if [ $SECONDS -lt $FILEAGE ]; then
cp -r '$DIRCONT' $DEST >> /root/logs/${TODAY}archive2log
if [[ -f '/mnt/dataoffload/$CUSTOMER/$DIRCONT' ]]; then
echo "File $DIRCONT would have been removed" #For testing only
#rm --force $DIRCONT >> /root/logs/${`date +%D`}archive2log
fi
fi
done
echo "All files move to $2."
fi
结果是:
cp: cannot stat '$DIRCONT': No such file or directory
然而,当我执行ls
命令时,它就在那里,更重要的是,如果我执行命令cp -r <filelocation/filename> <destination/>
,那么它可以正常工作。此外,如果我在脚本中发出pwd
,它会显示它位于正确的目录中,并且echo线返回正确的文件/目录名称,所以我真的不明白为什么它无法统计文件或目录。
我相信我的问题很可能是在循环线的行中,但输出似乎是正确的。在我将单引号放在./
部分之前,只要文件名中没有空格,它就会起作用;但是,如果有空格,它会解析每个单词并将其作为单独的文件进行尝试。如图所示的单引号可以正确返回所有内容,但没有一个可以正常工作,因此我不确定这是进展还是大会;)
任何人都可以解释为什么,或者,(或许)更重要的是告诉我如何修复代码?