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' --transform
opzione 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' -T
opzione 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' -C
opzione è necessaria in modo che tar sappia dove si trovano i file con nomi relativi. Il --no-recursion
flag è 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 find
comando è piuttosto potente e puoi testarlo semplicemente rimuovendo la tar
parte 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 find
di 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 solotar
la directory lo include ma contar -czf
esso sta solo aggiungendo i file.