
Estou tentando arquivar uma pasta de projeto com arquivos e pastas ocultos e recebo uma com uma entrada raiz .
. É irritante. Normalmente:
tar -czf $ARCHIVE_NAME -C $DIR .
criará um arquivo como
./package.json
./.git
./.gitignore
.
.
.
onde eu gostaria que a raiz do arquivo fosse os arquivos e pastas reais, sem uma .
entrada. Como
package.json
.git
.gitignore
.
.
.
Como faço isso?
*Editar*
A imagem abaixo pode ser útil para esclarecer esta questão.
- À esquerda, um arquivo criado com a ferramenta GUI do projeto (de dois dias atrás).
- À direita, um arquivo criado com o
tar
comando acima.
Observe a barra “Localização”; o arquivo à direita deve ser /
, enão /./
.
Responder1
./
significa o diretório atual. Suas duas listagens são idênticas.
Ter ./
na frente do arquivo ao listar o arquivo ajuda a lidar com arquivos com um nome especial. Um nome de arquivo -file
será exibido ./-file
permitindo que seja processado por uma segunda ferramenta.
Responder2
Alterando seu comando de
tar -czf $ARCHIVE_NAME -C $DIR .
para
tar -czf $ARCHIVE_NAME -C $DIR ./*
deve fazer o truque. Dessa forma, você não está dizendo "Adicionar o diretório .
ao arquivo", mas sim "Adicionar todos esses arquivos do diretório .
ao arquivo".
Responder3
Este comando irá tar os arquivos no diretório atual sem o início ./
:
tar cf /some/tarfile.tar *
É claro que não incluirá nomes de arquivos começando com ponto final, o que provavelmente não é o que você deseja. Você pode adicionar curingas adicionais para capturá-los:
tar cf /some/tarfile.tar * .[a-zA-Z]*
Mas esta não é uma solução de uso geral; você precisa saber quais nomes de arquivos estão no diretório para poder criar curingas apropriados.
GNU tar – que é o que a maioria das distribuições Linux usa – tem um recurso para transformar nomes de arquivos usando sed
expressões. Isso removerá os ./
arquivos ao criar o arquivo:
tar cf /some/tarfile.tar --transform 's,^\./,,' .
O arquivo resultante ainda terá uma entrada para "." próprio diretório.
Algumas versões do tar
podem ler os nomes dos arquivos a serem tarados de um arquivo. Você pode explorar esse recurso para fazer isso:
ls -a | egrep -v '^\.\.?$' | tar cf - -T /dev/stdin
Esse pipeline constrói uma lista de todos os arquivos no diretório atual, remove as entradas .
e ..
e canaliza o restante dos nomes para tar
. tar faz com que o arquivo a partir dos nomes dos arquivos seja lido /dev/stdin
(sua entrada padrão).