diretórios tar contendo espaços [duplicados]

0

Eu quero arquivar minhas fotos em arquivos tar.

O diretório que contém fotos tem um diretório por ano e vários diretórios dentro de cada diretório do ano:

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

A estrutura de destino também deve conter um diretório por ano, mas dentro de um diretório do ano eu teria arquivos tar.gz para cada subdir do diretório de origem, assim:

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

O script que estou criando para fazer isso é o seguinte:

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

Como sugerido no comentário, echoing o comando preparado parece bem, e também se eu copiar essa declaração e executá-lo do terminal funciona, mas executá-lo dentro do script ( tar czf $t "$d" ) resulta em um erro:

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

O que estou fazendo de errado?

P.S. Eu estou fazendo isso em um Mac.

    
por Anil 03.05.2016 / 06:57

1 resposta

2

Você está usando printf para escapar dos espaços, além de citá-lo ""

Se você omitir a chamada printf, e usar o $ d original com aspas duplas, você é bom.

    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
    
por 03.05.2016 / 07:14