BASH脚本 - 如何处理数据文件名中的空格

时间:2015-06-01 21:42:07

标签: linux bash shell

我正在编写一个脚本来将客户文件移动到备份服务器。因为这些是客户文件,所以我无法控制它们的命名方式。我们需要能够在处理之前将这些卸载到备份服务器,但到目前为止,脚本在处理名称中包含空格的任何目录或文件时都会遇到问题。我认为这可能是脚本中引用内容的方式,或者它可能是其他内容,但我无法弄明白。我找到了几个有希望的线索,包括:

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线返回正确的文件/目录名称,所以我真的不明白为什么它无法统计文件或目录。

我相信我的问题很可能是在循环线的行中,但输出似乎是正确的。在我将单引号放在./部分之前,只要文件名中没有空格,它就会起作用;但是,如果有空格,它会解析每个单词并将其作为单独的文件进行尝试。如图所示的单引号可以正确返回所有内容,但没有一个可以正常工作,因此我不确定这是进展还是大会;)

任何人都可以解释为什么,或者,(或许)更重要的是告诉我如何修复代码?

0 个答案:

没有答案