Eu normalmente faço:
tar -czvf my_directory.tar.gz my_directory
E se eu apenas quiser incluir tudo (incluindo todos os arquivos ocultos do sistema) no meu diretório, mas não o diretório em si? Eu não quero:
my_directory
--- my_file
--- my_file
--- my_file
Eu quero:
my_file
my_file
my_file
tar -czf
? No meu caso, é apenas armazenar os arquivos e não o diretório. Quando eu apenastar
o diretório ele inclui, mastar -czf
apenas adiciona os arquivos.Respostas:
deve fazer o trabalho em uma linha. Funciona bem para arquivos ocultos também. "*" não expande arquivos ocultos pela expansão do nome do caminho, pelo menos no bash. Abaixo está o meu experimento:
fonte
.
por,*
para que o comando sejacd my_directory/ && tar -zcvf ../my_dir.tgz * && cd ..
, ele funcionará conforme o esperado.$ (cd my_directory/ && tar -zcvf ../my_dir.tgz .)
cd
entrar em diretórios e sair é muito ruim. Poderia pelo menos usarpushd
epopd
setar
não tiver nenhum sinalizador como-C
.Use o
-C
interruptor de alcatrão:O
-C my_directory
comando tar indica que o diretório atual deve ser alteradomy_directory
e.
significa "adicionar o diretório atual inteiro" (incluindo arquivos e subdiretórios ocultos).Certifique-se de fazê-lo
-C my_directory
antes de fazê- lo,.
ou então você obterá os arquivos no diretório atual.fonte
tar --create --file=foo.tar -C /etc passwd hosts -C /lib libc.a
" apl.jhu.edu/Misc/Unix-info/tar/tar_65.html Eu sempre tentotar -czvf my_directory.tar.gz * -C my_directory
e isso não funciona.-C
localização é importante! Porra tar ...*
não incluirá arquivos ocultos (que era o requisito original).Você também pode criar um arquivo morto como de costume e extraí-lo com:
fonte
--strip-components
é uma extensão GNU.Dê uma olhada em
--transform
/--xform
, ele oferece a oportunidade de massagear o nome do arquivo à medida que o arquivo é adicionado ao arquivo:A expressão Transform é semelhante à de
sed
, e podemos usar separadores diferentes de/
(,
no exemplo acima).https://www.gnu.org/software/tar/manual/html_section/tar_52.html
fonte
file list too long
. Minha solução evita isso e é mais flexível também.--xform
várias vezes para vários caminhos.TL; DR
Com algumas condições (arquive apenas arquivos, diretórios e links simbólicos):
Explicação
Infelizmente, o abaixo inclui um diretório pai
./
no arquivo:Você pode mover todos os arquivos desse diretório usando a
--transform
opção de configuração, mas isso não se livra do.
próprio diretório. Torna-se cada vez mais difícil domesticar o comando.Você pode usar
$(find ...)
para adicionar uma lista de arquivos ao comando (como na resposta da magnus ), mas isso pode causar um erro "lista de arquivos muito longa". A melhor maneira é combiná-lo com a-T
opção do tar , assim:Basicamente, o que ele faz é listar todos os arquivos (
-type f
), links (-type l
) e subdiretórios (-type d
) no seu diretório, tornar todos os nomes de arquivos relativos-printf "%P\n"
, e depois passar isso para o comando tar (são utilizados nomes de arquivos do STDIN-T -
). A-C
opção é necessária para que o tar saiba onde estão os arquivos com nomes relativos. O--no-recursion
sinalizador é para que o tar não recue em pastas que é solicitado a arquivar (causando arquivos duplicados).Se você precisar fazer algo especial com os nomes de arquivos (filtragem, seguintes links simbólicos etc.), o
find
comando é bastante poderoso e você pode testá-lo apenas removendo atar
parte do comando acima:Por exemplo, se você deseja filtrar arquivos PDF, adicione
! -name '*.pdf'
Localização não GNU
O comando usa
printf
(disponível no GNUfind
) que indicafind
para imprimir seus resultados com caminhos relativos. No entanto, se você não possui o GNUfind
, isso funciona para tornar os caminhos relativos (remove os pais comsed
):fonte
Esta resposta deve funcionar na maioria das situações. Observe, no entanto, como os nomes de arquivos são armazenados no arquivo tar como, por exemplo,
./file1
ao invés de apenasfile1
. Descobri que isso causava problemas ao usar esse método para manipular tarballs usados como arquivos de pacote no BuildRoot .Uma solução é usar alguns globos Bash para listar todos os arquivos, exceto os
..
seguintes:Este é um truque que aprendi com esta resposta .
Agora, o tar retornará um erro se não houver arquivos correspondentes
..?*
ou.[^.]*
, mas ainda funcionará. Se o erro for um problema (você está verificando o sucesso em um script), isso funciona:Embora agora estamos mexendo com as opções do shell, podemos decidir que é melhor ter
*
arquivos ocultos correspondentes:Isso pode não funcionar onde seu shell está
*
no diretório atual; portanto, use alternativamente:fonte
tar: start.sh: Cannot stat: No such file or directory
Isso acontece com todos os arquivos no meu diretório atual! Como evito isso?fonte
Se for um sistema Unix / Linux, e você se preocupa com arquivos ocultos (que serão perdidos por *), você precisa:
Não sei como são os arquivos ocultos no Windows.
fonte
Eu proporia a seguinte função Bash (o primeiro argumento é o caminho para o dir, o segundo argumento é o nome da base do arquivo resultante):
Você pode executá-lo desta maneira:
e irá gerar o arquivo
my_archive.tar.gz
no diretório atual. Funciona com elementos ocultos (. *) E com elementos com espaços no nome do arquivo.fonte
Este funcionou para mim e inclui todos os arquivos ocultos sem colocar todos os arquivos em um diretório raiz chamado "." como na resposta de tomoe :
fonte
Exemplo:
Você é bem vindo.
fonte
Isto é o que funciona para mim.
Você também pode usar
No primeiro comando, find retorna uma lista de arquivos e subdiretórios de my_dir . No entanto, o diretório my_dir é incluído nessa lista como '.' O -printf parâmetro remove o caminho completo, incluindo o '.' e também todoscrlf No entanto, o espaçono formato, a string '% P' de printf deixa um remanescente na lista de arquivos e subdiretórios de my_dir e pode ser vista por um espaço à esquerda no resultado do comando find .
Isso não será um problema para o TAR, mas se você quiser corrigir isso, adicione -mindepth 1 como no segundo comando.
fonte
Use pax.
Pax é um pacote obsoleto, mas faz o trabalho perfeitamente e de maneira simples.
fonte
Maneira mais simples que encontrei:
cd my_dir && tar -czvf ../my_dir.tar.gz *
fonte
Lida com segurança com nomes de arquivos com espaços ou outros caracteres incomuns. Opcionalmente, você pode adicionar um
-name '*.sql'
filtro ou semelhante ao comando find para limitar os arquivos incluídos.fonte
Se a pasta for mytemp, se você aplicar o procedimento acima, ela compactará e removerá todos os arquivos da pasta, mas a deixará em paz
Você pode fornecer padrões de exclusão e também especificar para não examinar as subpastas também
fonte
fonte