Tar ignores - opção de diretório

0

Estou tentando pegar um diretório e criar um arquivo dele no meu diretório pessoal a partir de outro local. Eu sei que a opção -C pode ser usada para isso, mas tar parece estar ignorando isso. Eu tentei $(basename $DEST)_$(date +%F_%H%M%S).tar.gz -C $HOME $(basename $DEST) onde $DEST é o caminho para o diretório que eu quero arquivar. Em vez de criar o arquivo no meu diretório home, o tar continua criando no diretório do qual estou executando. Há algo de errado com a maneira como estou executando o alcatrão? Tudo o mais parece funcionar corretamente, é só que o sinalizador -C está sendo completamente ignorado. Estou na edição Linux Mint 18.3 XFCE.

Editar: O comando completo é tar czf Pictures_$CREATION_TIMESTAMP.tar.gz -C /home/$USER Pictures . Eu estava executando de /home/$USER/coding/python_code/ .

    
por alyms108 14.06.2018 / 03:13

3 respostas

3

-C não afeta onde o arquivo é criado. Isso afeta apenas quais arquivos são adicionados ao arquivo. Assim, por exemplo, dado tar cvf foo.tar a -C /b c -C /d e , tar adicionará a do diretório atual, alterne para /b e adicione c , mude para /d e adicione e . foo.tar será criado no diretório atual (onde a foi).

Se nenhum arquivo for fornecido na linha de comando para adicionar, mas -C /some/dir for usado, então tar mudará para /some/dir e adicionará tudo nele ao arquivo morto.

(Da mesma forma, ao extrair, -C não afeta onde tar procura o arquivo morto. Isso afeta somente onde os arquivos extraídos vão).

Portanto: tar czf Pictures_$CREATION_TIMESTAMP.tar.gz -C /home/$USER Pictures de /home/$USER/coding/python_code/ sempre criará o arquivo em /home/$USER/coding/python_code/ , com o diretório Pictures de /home/$USER .

Se você quiser que o diretório Pictures de /home/$USER em um arquivo criado em /home/$USER , você precisará cd to /home/$USER e criar o arquivo:

cd "/home/$USER"; tar czf "Pictures_$CREATION_TIMESTAMP.tar.gz" Pictures

Ou especifique o caminho para o arquivo:

tar czf "/home/$USER/Pictures_$CREATION_TIMESTAMP.tar.gz" -C "/home/$USER" Pictures
    
por 14.06.2018 / 04:29
0

De uma página de manual tar :

-C, --directory=DIR

Change to DIR before performing any operations. This option is order-sensitive, i.e. it affects all options that follow.

Portanto, a maneira correta de arquivar um diretório, por exemplo /srv/www , é:

tar -C /srv/www -czf www.tgz

(Observe que, como você deve começar com -C < directort >, é preciso dizer -czf com - para que sejam compreendidos como opções.)

Claro, você sempre pode fazer o cd explicitamente:

(cd /srv/www; tar czf - .) > www.tgz
    
por 14.06.2018 / 04:02
0

Obrigado pela edição.

Parece que você está usando variáveis de shell e substituição de comando para especificar o nome do arquivo e o diretório que deseja arquivar.

Isso fará o que você precisa:

tar czfv $HOME'/Pictures_'$CREATION_TIMESTAMP'.tar.gz' "$DEST" -C Pictures

Eu adicionei v para torná-lo detalhado para que você possa ver o que está acontecendo. A variável $HOME , obviamente, expande para o seu diretório inicial e estou levando em conta que $ CREATION_TIMESTAMP é uma variável para a hora. Você afirmou que $DEST especifica o caminho para o diretório que você está tentando arquivar, por isso está no final onde normalmente estaria. Eu coloco aspas duplas em torno do $DEST no caso do caminho contiver espaços, mas se isso não acontecer, então você pode removê-los. Se $ CREATION_TIMESTAMP for igual ao que você tem acima de $(date +%F_%H%M%S) , ele não terá espaços, portanto, não são necessárias aspas duplas. O -C remove o aninhamento para que apenas Pictures seja compactado.

    
por 14.06.2018 / 04:13