2016-08-05 122 views
0

我有以下几点:即使文件确实存在

while [ "${*}" != "" ] ; do 

DPX_FOLDER="${1}" 
TARGET_FOLDER="/Users/medialab/Desktop/07_DPX_checksums"/$(basename "${DPX_FOLDER}") 
mkdir "${TARGET_FOLDER}" 
echo 
for file in "${DPX_FOLDER}"/*DPX/* ; do 
    if [ -f "${TARGET_FOLDER}"/"$file" ] ; then 
     echo "$file" exists, skipping 
    else rsync -aPhi "$file" "${TARGET_FOLDER}" 
    fi 
    break 1 
done 

我的脚本不呼应"$file" exists, skipping。它转到else语句并且每次运行。我的发言有问题吗?

+0

是否有您的文件名空间?另外,您的示例目前不可重现。 – merlin2011

+0

@ merlin2011,引用是正确的(除了$(basename“$ DPX_FOLDER”)调用的引用外),所以空格不是问题。另一方面,脚本希望'DPX_FOLDER'目录存在于'TARGET_FOLDER'下,并且*假设可能是错误的。 –

+0

你刚刚创建了目标文件夹,所以它应该是空的。为什么文件已经存在? – Barmar

回答

1

这几乎可以肯定是DPX_FOLDER包含你不想在你的目的地的路径元素的情况。

DPX_FOLDER=/Users/hello/world 
for file in "${DPX_FOLDER}"/*DPX/* ; do 

...意味着你必须file值看起来像/Users/hello/world/123DPX/foo

因此,"${TARGET_FOLDER}"/"$file"看起来像:

/Users/medialab/Desktop/07_DPX_checksums/world/Users/hello/world/123DPX/foo 
#\---- "${TARGET_FOLDER}" -------------------/ |--- file -----------------| 
#            |--- "${DPX_FOLDER}"----| * 

假设你没有一个下/Users你的其他/Users,然后,将另一条路径追加到另一条路上就是错误的。

考虑,而不是:

for file in "${DPX_FOLDER}"/*DPX/* ; do 
    if [ -f "${TARGET_FOLDER}/${file##*/}" ] ; then 
     echo "$file exists, skipping" 
    else 
     rsync -aPhi "$file" "${TARGET_FOLDER}" 
    fi 
done