包含空格的 tar 目录

包含空格的 tar 目录

我想将我的照片存档到 tar 档案中。

包含照片的目录每年有一个目录,并且每年目录中有多个目录:

Photos
    2005
    2006
        Some dir with spaces
            Pic1.jpg
            Pic2.jpg
            ...
        Other dir here
        ...
    2007
    ...

目标结构还应该包含每年一个目录,但在一年的目录内,我将为源目录中的每个子目录提供 tar.gz 文件,如下所示:

Backup
    2005
    2006
        Some_dir_with_spaces.tar.gz
        Other_dir_here.tar.gz
        ...
    2007
    ...

我为此创建的脚本如下所示:

cd ~/Photos
for y in *
do
    YEAR_DIR=~/Backup/$y
    mkdir -p $YEAR_DIR

    pushd $y

    for d in *
    do
        f=`echo $d | tr ' ' '_' | tr -d ',.!'`  # Clean the name
        t=$YEAR_DIR/$f.tar.gz
        d=$(printf '%q' "$d")
        # echo tar czf $t "$d"  # This outputs the command as expected
        tar czf $t "$d"  # but executing it results in error: Cannot stat: No such file or directory
    done

    popd
done

正如评论中所暗示的,回显准备好的命令看起来很好,而且如果我复制该语句并从终端执行它,它也可以工作,但在脚本 ( tar czf $t "$d") 中执行它会导致错误:

tar: Some\ dir\ with\ spaces: Cannot stat: No such file or directory

我究竟做错了什么?

PS 我是在 Mac 上做的。

答案1

您正在使用 printf 来转义空格,并引用它“”

如果省略 printf 调用,并使用带双引号的原始 $d ,就可以了。

    f=`echo $d | tr ' ' '_' | tr -d ',.!'`  # Clean the name
    t=$YEAR_DIR/$f.tar.gz
    ##d=$(printf '%q' "$d") escapes the spaces
    # echo tar czf $t "$d"  # This outputs the command as expected
    tar czf $t "$d" ## "$d" also escapes the spaces

相关内容