スペースを含むtarディレクトリ

スペースを含むtarディレクトリ

私の写真をtarアーカイブに保存したいです。

毎年写真を含む1つのカタログがあり、毎年複数のカタログがあります。

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

おすすめ記事