Comment puis-je le goudron d'un répertoire de fichiers et de dossiers sans y compris le répertoire lui-même?
En général, je n':
tar -czvf my_directory.tar.gz my_directory
Ce que si je veux juste inclure tout (y compris toute fichiers cachés du système) dans my_directory, mais pas le répertoire lui-même? Je ne veux pas:
my_directory
--- my_file
--- my_file
--- my_file
Je veux:
my_file
my_file
my_file
- Pas vraiment de la programmation, mais peut-être plus approprié de serverfault.com.
- Aujourd'hui, il serait approprié pour superuser.com
- C'est que le comportement par défaut de faire
tar -czf
? Dans mon cas, c'est seulement le stockage des fichiers et non pas le répertoire. Quand je viens detar
le répertoire, il les comprend, mais avectar -czf
c'est seulement d'ajouter les fichiers.
Vous devez vous connecter pour publier un commentaire.
devrait faire le travail en une seule ligne. Il fonctionne bien pour les fichiers masqués. "*" ne développe pas les fichiers cachés par le nom de chemin d'expansion au moins dans bash. Ci-dessous mon expérience:
.
avec*
donc la commande seracd my_directory/ && tar -zcvf ../my_dir.tgz * && cd ..
il fonctionnera comme prévu.$ (cd my_directory/ && tar -zcvf ../my_dir.tgz .)
cd
ing en répertoires et est assez boiteux. Pourrait au moins utiliserpushd
etpopd
sitar
n'ont pas de drapeaux comme-C
.Utiliser le
-C
commutateur de goudron:La
-C my_directory
dit de goudron pour changer le répertoire courant àmy_directory
, puis.
signifie "ajouter l'intégralité du répertoire courant" (y compris les fichiers cachés et les sous-répertoires).Assurez-vous de ne
-C my_directory
avant de vous faire.
, sinon vous allez obtenir les fichiers dans le répertoire courant.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 qui ne fonctionne pas.-C
emplacement est important! Putain de goudron...-C
échoue si elle est combinée avec d'expansion des jokers. Il globules dans le réel répertoire courant, puis tente de trouver les fichiers dans le tar répertoire courant.tar cf foo.tar -C /lib lib*
résultats danstar: lib*: Cannot stat: No such file or directory
*
ne sera pas inclure les fichiers cachés (qui était à l'origine de l'exigence).tar
comme un remplacement pourcp
..
répertoire parent, voici la solutionVous pouvez également créer une archive comme d'habitude et l'extraire avec:
--strip-components
est une extension GNU.Ont un coup d'oeil à
--transform
/--xform
, il vous donne la possibilité de massage le nom de fichier que le fichier est ajouté à l'archive:Transformer l'expression est similaire à celle de
sed
, et nous pouvons utiliser des séparateurs d'autres que/
(,
dans l'exemple ci-dessus).https://www.gnu.org/software/tar/manual/html_section/tar_52.html
file list too long
. Ma solution l'en empêche et est plus flexible.TL;DR
Avec certaines conditions (archive uniquement les fichiers, répertoires et liens symboliques):
Explication
Ci-dessous malheureusement comprend un répertoire parent
./
dans l'archive:Vous pouvez déplacer tous les fichiers de ce répertoire à l'aide de la
--transform
option de configuration, mais ce n'est pas de se débarrasser de la.
répertoire lui-même. Il devient de plus en plus difficile à apprivoiser la commande.Vous pouvez utiliser
$(find ...)
pour ajouter un fichier à la liste de la commande (comme dans magnus réponse), mais qui peut potentiellement causer une "liste de fichier trop long d'erreur". La meilleure façon est de le combiner avec du goudron de-T
option, comme ceci:Fondamentalement, ce qu'il fait est la liste de tous les fichiers (
-type f
), des liens (-type l
) et des sous-répertoires (-type d
) sous votre répertoire, faire tous les noms de fichiers relatifs à l'aide-printf "%P\n"
, et de passer ensuite que la commande tar (il prend les noms de fichiers à partir de STDIN à l'aide de-T -
). Le-C
option est nécessaire afin de goudron sait où les fichiers avec des noms relatifs sont situés. Le--no-recursion
drapeau est ainsi que le goudron n'est pas récursif dans les dossiers qu'il est dit aux archives (causant des fichiers en double).Si vous avez besoin de faire quelque chose de spécial avec des noms de fichiers (filtrage, en suivant les liens symboliques, etc), le
find
de commande est assez puissant, et vous pouvez la tester en enlevant juste letar
partie de la commande ci-dessus:Par exemple, si vous souhaitez filtrer des fichiers PDF, ajouter
! -name '*.pdf'
Non-GNU trouver
La commande utilise
printf
(disponible sous GNUfind
) qui racontefind
pour imprimer ses résultats avec des chemins relatifs. Toutefois, si vous n'avez pas de GNUfind
, cela fonctionne pour faire les chemins relatifs (supprime les parents avecsed
):Cette Réponse devrait fonctionner dans la plupart des situations. Cependant la façon dont les fichiers sont stockés dans le fichier tar, par exemple,
./file1
plutôt que de simplementfile1
. J'ai trouvé que cela a causé des problèmes lors de l'utilisation de cette méthode pour manipuler les archives utilisées comme des fichiers de package dans BuildRoot.Une solution consiste à utiliser certains Bash globs à la liste de tous les fichiers, sauf pour
..
comme ceci:C'est un truc que j'ai appris de cette réponse.
Maintenant goudron retournera une erreur si il n'y a pas les fichiers qui correspondent à
..?*
ou.[^.]*
, mais il faudra encore travailler. Si l'erreur est un problème (vous êtes la vérification de la réussite dans un script), cela fonctionne:Bien que maintenant, nous sommes à vous embêter avec des options d'environnement, on peut décider qu'il est plus lisible d'avoir
*
match les fichiers cachés:Cela pourrait ne pas fonctionner lorsque votre shell globs
*
dans le répertoire en cours, vous pouvez également utiliser:tar: start.sh: Cannot stat: No such file or directory
Ce qui se passe pour tous les fichiers dans mon répertoire en cours! Comment puis-je éviter cela?Si c'est un système Unix/Linux, et vous vous souciez de fichiers cachés (qui sera manqué par un *), que vous devez faire:
Je ne sais pas ce que les fichiers cachés dans Windows.
Je propose la suite de Bash function (premier argument est le chemin d'accès à la dir, le deuxième argument est le nom de base de l'archive):
Vous pouvez l'exécuter de cette façon:
et il va générer l'archive
my_archive.tar.gz
dans le répertoire courant. Il fonctionne avec cachés (.*) les éléments et avec les éléments, avec des espaces dans leur nom de fichier.Ce a travaillé pour moi et il inclut tous les fichiers cachés sans se mettre tous les fichiers dans un répertoire racine nommé "." comme dans tomoe réponse :
Utilisation pax.
Pax est un paquet obsolète mais fait le travail parfaitement et de manière plus simple.
Façon la plus simple que j'ai trouvé:
cd my_dir && tar-czvf ../my_dir.tar.gz *
En toute sécurité gère les noms de fichiers avec des espaces ou d'autres caractères inhabituels. Vous pouvez éventuellement ajouter un
-name '*.sql'
ou filtre semblable à la commande rechercher pour limiter les fichiers inclus.Si le dossier est mytemp alors si vous appliquez ce qui précède, il va de zip et de supprimer tous les fichiers dans le dossier mais le laisser seul
Vous pouvez donner à exclure des modèles et aussi spécifier de ne pas regarder dans les sous-dossiers trop