TL; DR
find /my/dir/ -printf "%P\n" | tar -czf mydir.tgz --no-recursion -C /my/dir/ -T -
Com algumas condições (arquive apenas arquivos, diretórios e links simbólicos):
find /my/dir/ -printf "%P\n" -type f -o -type l -o -type d | tar -czf mydir.tgz --no-recursion -C /my/dir/ -T -
Explicação
Infelizmente, o abaixo inclui um diretório pai ./
no arquivo:
tar -czf mydir.tgz -C /my/dir .
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:
find /my/dir/ -printf "%P\n" -type f -o -type l -o -type d | tar -czf mydir.tgz --no-recursion -C /my/dir/ -T -
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 a tar
parte do comando acima:
$ find /my/dir/ -printf "%P\n" -type f -o -type l -o -type d
> textfile.txt
> documentation.pdf
> subfolder2
> subfolder
> subfolder/.gitignore
Por exemplo, se você deseja filtrar arquivos PDF, adicione ! -name '*.pdf'
$ find /my/dir/ -printf "%P\n" -type f ! -name '*.pdf' -o -type l -o -type d
> textfile.txt
> subfolder2
> subfolder
> subfolder/.gitignore
Localização não GNU
O comando usa printf
(disponível no GNU find
) que indica find
para imprimir seus resultados com caminhos relativos. No entanto, se você não possui o GNU find
, isso funciona para tornar os caminhos relativos (remove os pais com sed
):
find /my/dir/ -type f -o -type l -o -type d | sed s,^/my/dir/,, | tar -czf mydir.tgz --no-recursion -C /my/dir/ -T -
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.