TL; DR
find /my/dir/ -printf "%P\n" | tar -czf mydir.tgz --no-recursion -C /my/dir/ -T -
Sous certaines conditions (archiver uniquement les fichiers, les répertoires et les liens symboliques):
find /my/dir/ -printf "%P\n" -type f -o -type l -o -type d | tar -czf mydir.tgz --no-recursion -C /my/dir/ -T -
Explication
Ce qui suit inclut malheureusement un répertoire parent ./
dans l'archive:
tar -czf mydir.tgz -C /my/dir .
Vous pouvez déplacer tous les fichiers hors de ce répertoire en utilisant l' --transform
option de configuration, mais cela ne supprime pas le .
répertoire lui-même. Il devient de plus en plus difficile d'apprivoiser la commande.
Vous pouvez utiliser $(find ...)
pour ajouter une liste de fichiers à la commande (comme dans la réponse de magnus ), mais cela peut potentiellement provoquer une erreur "liste de fichiers trop longue". La meilleure façon est de le combiner avec l' -T
option de tar , comme ceci:
find /my/dir/ -printf "%P\n" -type f -o -type l -o -type d | tar -czf mydir.tgz --no-recursion -C /my/dir/ -T -
Fondamentalement, il répertorie tous les fichiers ( -type f
), liens ( -type l
) et sous-répertoires ( -type d
) de votre répertoire, rend tous les noms de fichiers relatifs à l'aide -printf "%P\n"
, puis transmet cela à la commande tar (il prend les noms de fichiers de STDIN à l'aide -T -
). L' -C
option est nécessaire pour que tar sache où se trouvent les fichiers avec des noms relatifs. Le --no-recursion
drapeau est pour que tar ne rentre pas dans les dossiers qu'il est invité à archiver (provoquant des fichiers en double).
Si vous avez besoin de faire quelque chose de spécial avec les noms de fichiers (filtrage, suivi des liens symboliques, etc.), la find
commande est assez puissante, et vous pouvez la tester en supprimant simplement la tar
partie de la commande ci-dessus:
$ find /my/dir/ -printf "%P\n" -type f -o -type l -o -type d
> textfile.txt
> documentation.pdf
> subfolder2
> subfolder
> subfolder/.gitignore
Par exemple, si vous souhaitez filtrer des fichiers PDF, ajoutez ! -name '*.pdf'
$ find /my/dir/ -printf "%P\n" -type f ! -name '*.pdf' -o -type l -o -type d
> textfile.txt
> subfolder2
> subfolder
> subfolder/.gitignore
Recherche non GNU
La commande utilise printf
(disponible dans GNU find
) qui indique find
d'imprimer ses résultats avec des chemins relatifs. Cependant, si vous n'avez pas GNU find
, cela fonctionne pour rendre les chemins relatifs (supprime les parents avec 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
? Dans mon cas, il s'agit uniquement de stocker les fichiers et non le répertoire. Quand je vienstar
du répertoire, il l'inclut, mais avec lui,tar -czf
il ajoute seulement les fichiers.