TL; DR
find /my/dir/ -printf "%P\n" | tar -czf mydir.tgz --no-recursion -C /my/dir/ -T -
Con alcune condizioni (archivia solo file, directory e collegamenti simbolici):
find /my/dir/ -printf "%P\n" -type f -o -type l -o -type d | tar -czf mydir.tgz --no-recursion -C /my/dir/ -T -
Spiegazione
Di seguito purtroppo include una directory principale ./nell'archivio:
tar -czf mydir.tgz -C /my/dir .
È possibile spostare tutti i file da quella directory utilizzando l' --transformopzione di configurazione, ma ciò non elimina la .directory stessa. Diventa sempre più difficile domare il comando.
È possibile utilizzare $(find ...)per aggiungere un elenco di file al comando (come nella risposta di magnus ), ma ciò potrebbe potenzialmente causare un errore "Elenco file troppo lungo". Il modo migliore è combinarlo con l' -Topzione tar , in questo modo:
find /my/dir/ -printf "%P\n" -type f -o -type l -o -type d | tar -czf mydir.tgz --no-recursion -C /my/dir/ -T -
Fondamentalmente ciò che fa è elencare tutti i file ( -type f), i collegamenti ( -type l) e le sottodirectory ( -type d) nella directory, rendere tutti i nomi dei file relativi usando -printf "%P\n"e quindi passarli al comando tar (prende i nomi dei file da STDIN usando -T -). L' -Copzione è necessaria in modo che tar sappia dove si trovano i file con nomi relativi. Il --no-recursionflag è in modo tale che tar non ricorra nelle cartelle che gli viene detto di archiviare (causando file duplicati).
Se hai bisogno di fare qualcosa di speciale con i nomi dei file (filtro, seguendo i collegamenti simbolici ecc.), Il findcomando è piuttosto potente e puoi testarlo semplicemente rimuovendo la tarparte del comando sopra:
$ find /my/dir/ -printf "%P\n" -type f -o -type l -o -type d
> textfile.txt
> documentation.pdf
> subfolder2
> subfolder
> subfolder/.gitignore
Ad esempio, se si desidera filtrare i file PDF, aggiungere ! -name '*.pdf'
$ find /my/dir/ -printf "%P\n" -type f ! -name '*.pdf' -o -type l -o -type d
> textfile.txt
> subfolder2
> subfolder
> subfolder/.gitignore
Trova non GNU
Il comando usa printf(disponibile in GNU find) che dice finddi stampare i suoi risultati con percorsi relativi. Tuttavia, se non hai GNU find, questo funziona per rendere i percorsi relativi (rimuove i genitori con 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? Nel mio caso memorizza solo i file e non la directory. Quando ho solotarla directory lo include ma contar -czfesso sta solo aggiungendo i file.