Je fais généralement:
tar -czvf my_directory.tar.gz my_directory
Que faire si je veux simplement tout inclure (y compris les fichiers système cachés) dans mon_répertoire, mais pas le répertoire lui-même? Je ne veux pas:
my_directory
--- my_file
--- my_file
--- my_file
Je voudrais:
my_file
my_file
my_file
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.Réponses:
devrait faire le travail sur une seule ligne. Cela fonctionne aussi bien pour les fichiers cachés. "*" ne développe pas les fichiers cachés par extension du nom de chemin au moins dans bash. Voici mon expérience:
la source
.
par*
ainsi la commande seracd my_directory/ && tar -zcvf ../my_dir.tgz * && cd ..
alors elle fonctionnera comme vous vous y attendiez.$ (cd my_directory/ && tar -zcvf ../my_dir.tgz .)
cd
entrer dans les répertoires et sortir est assez boiteux. Pourrait au moins utiliserpushd
etpopd
s'iltar
n'avait pas de drapeaux comme-C
.Utilisez le
-C
commutateur de tar:Le
-C my_directory
dit à tar de changer le répertoire courant enmy_directory
, puis.
signifie "ajouter tout le répertoire courant" (y compris les fichiers et sous-répertoires cachés).Assurez-vous de le faire
-C my_directory
avant de le faire,.
sinon vous obtiendrez les fichiers dans le répertoire actuel.la source
tar --create --file=foo.tar -C /etc passwd hosts -C /lib libc.a
" apl.jhu.edu/Misc/Unix-info/tar/tar_65.html J'essaie toujourstar -czvf my_directory.tar.gz * -C my_directory
et cela ne fonctionne pas.-C
l'emplacement est important! Merde tar ...*
n'inclura pas les fichiers cachés (ce qui était l'exigence d'origine).Vous pouvez également créer des archives comme d'habitude et les extraire avec:
la source
--strip-components
une extension GNU.Jetez un œil à
--transform
/--xform
, cela vous donne la possibilité de masser le nom du fichier lorsque le fichier est ajouté à l'archive:L'expression de transformation est similaire à celle de
sed
, et nous pouvons utiliser des séparateurs autres que/
(,
dans l'exemple ci-dessus).https://www.gnu.org/software/tar/manual/html_section/tar_52.html
la source
file list too long
. Ma solution empêche cela et est également plus flexible.--xform
plusieurs fois pour plusieurs chemins.TL; DR
Sous certaines conditions (archiver uniquement les fichiers, les répertoires et les liens symboliques):
Explication
Ce qui suit inclut malheureusement un répertoire parent
./
dans l'archive: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: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 latar
partie de la commande ci-dessus:Par exemple, si vous souhaitez filtrer des fichiers PDF, ajoutez
! -name '*.pdf'
Recherche non GNU
La commande utilise
printf
(disponible dans GNUfind
) qui indiquefind
d'imprimer ses résultats avec des chemins relatifs. Cependant, si vous n'avez pas GNUfind
, cela fonctionne pour rendre les chemins relatifs (supprime les parents avecsed
):la source
Cette réponse devrait fonctionner dans la plupart des situations. Notez cependant comment les noms de fichiers sont stockés dans le fichier tar comme, par exemple,
./file1
plutôt que simplementfile1
. J'ai constaté que cela causait des problèmes lors de l'utilisation de cette méthode pour manipuler les archives tar utilisées comme fichiers de package dans BuildRoot .Une solution consiste à utiliser des globes Bash pour répertorier tous les fichiers, sauf
..
comme ceci:C'est une astuce que j'ai apprise de cette réponse .
Maintenant, tar renverra une erreur s'il n'y a aucun fichier correspondant à
..?*
ou.[^.]*
, mais cela fonctionnera toujours. Si l'erreur est un problème (vous vérifiez le succès dans un script), cela fonctionne:Bien que nous jouions maintenant avec les options du shell, nous pourrions décider qu'il est plus simple de faire
*
correspondre les fichiers cachés:Cela pourrait ne pas fonctionner là où vos globes shell
*
dans le répertoire en cours, alors alternativement, utilisez:la source
tar: start.sh: Cannot stat: No such file or directory
Cela arrive à tous les fichiers de mon répertoire actuel! Comment éviter cela?la source
Si c'est un système Unix / Linux, et que vous vous souciez des fichiers cachés (qui seront manqués par *), vous devez faire:
Je ne sais pas à quoi ressemblent les fichiers cachés sous Windows.
la source
Je proposerais la fonction Bash suivante (le premier argument est le chemin d'accès au répertoire, le deuxième argument est le nom de base de l'archive résultante):
Vous pouvez l'exécuter de cette façon:
et il générera l'archive
my_archive.tar.gz
dans le répertoire courant. Il fonctionne avec des éléments cachés (. *) Et avec des éléments avec des espaces dans leur nom de fichier.la source
Celui-ci a fonctionné pour moi et il inclut tous les fichiers cachés sans mettre tous les fichiers dans un répertoire racine nommé "." comme dans la réponse de tomoe :
la source
Exemple:
Je vous en prie.
la source
C'est ce qui fonctionne pour moi.
Vous pouvez également utiliser
Dans la première commande, find renvoie une liste de fichiers et sous-répertoires de my_dir . Cependant, le répertoire my_dir est lui-même inclus dans cette liste en tant que '.' Le -printf paramètre supprime le chemin complet, y compris celui «.» et aussi touscrlf Cependant, le espacedans la chaîne de format '% P' de printf laisse un reste dans la liste des fichiers et sous-répertoires de my_dir et peut être vu par un espace de tête dans le résultat de la commande find .
Ce ne sera pas un problème pour TAR mais si vous voulez résoudre ce problème, ajoutez -mindepth 1 comme dans la deuxième commande.
la source
Utilisez pax.
Pax est un package obsolète, mais fait le travail parfaitement et de manière simple.
la source
Le moyen le plus simple que j'ai trouvé:
cd my_dir && tar -czvf ../my_dir.tar.gz *
la source
Gère en toute sécurité les noms de fichiers avec des espaces ou d'autres caractères inhabituels. Vous pouvez éventuellement ajouter un
-name '*.sql'
filtre ou similaire à la commande find pour limiter les fichiers inclus.la source
Si le dossier est mytemp, si vous appliquez ce qui précède, il compressera et supprimera tous les fichiers du dossier, mais laissez-le tranquille
Vous pouvez donner des motifs d'exclusion et également spécifier de ne pas regarder trop dans les sous-dossiers
la source
la source