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 --transformopçã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 -Topçã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 -Copção é necessária para que o tar saiba onde estão os arquivos com nomes relativos. O --no-recursionsinalizador é 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 findcomando é bastante poderoso e você pode testá-lo apenas removendo a tarparte 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 findpara 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 apenastaro diretório ele inclui, mastar -czfapenas adiciona os arquivos.