Je peux probablement écrire un script shell pour trouver des fichiers uniquement, puis passer la liste à tar, mais je me demande s'il existe déjà une fonctionnalité intégrée dans tar qui permet de faire exactement cela, dans une seule ligne de commande?
Par exemple, j'ai trouvé le --no-recursion
commutateur, mais quand je le fais:
tar --no-recursion -cvf mydir.tar mydir
Il archive uniquement les noms des entrées du répertoire (y compris les sous-répertoires!), Mais il n'archive aucun fichier.
J'ai aussi essayé:
tar --no-recursion -cvf mydir.tar mydir/*
Mais s'il archive uniquement les fichiers, il archive également les noms des sous-répertoires.
Existe-t-il un moyen de dire uniquement aux fichiers tar, pas de répertoires?
find mydir -type f |xargs cp -t tempdir
, puis tar tempdir.find mydir -depth 1 -type f | xargs tar cf mydir.tar
find mydir -maxdepth 1 -type f -exec tar cvf mydir.tar {} +
. Le+
met tous les fichiers sur la même ligne de commande comme xargs.Réponses:
Comme le fait remarquer camh, la commande précédente avait un petit problème en ce que, étant donné trop de noms de fichiers, elle s'exécuterait plus d'une fois, avec des invocations ultérieures effaçant silencieusement les exécutions précédentes. Comme nous ne compressons pas trop, nous pouvons ajouter au lieu d'écraser:
La réponse d' Iocnarz concernant l' utilisation
tar
des options--null
et des-T
options fonctionne également. Si vous avezcpio
installé, la réponse de camh en l' utilisant est également très bien. Et si vous l'avezzsh
et ne vous dérange pas de l'utiliser pour une commande, la réponse de Gilles en utilisant un zsh glob (*(.)
) semble la plus simple.La clé était l'
-maxdepth
option. Réponse finale, gestion appropriée des espaces:Cela devrait également fonctionner:
la source
tar
. Les deuxxargs
etfind
avec la+
variante ont un nombre maximum d'arguments qui peuvent être passés à tar. Cela entraînera la deuxième invocation de tar en écrasant la sortie de la première.-x
pour forcer les xargs à échouer au lieu de perdre des données, et bien que mieux qu'un bogue de perte de données silencieux, ce n'est toujours pas idéal. Ce bogue de tri est si dangereux car tout semble correct au premier abord, mais au fur et à mesure que la liste des fichiers s'allonge, vous commencez à le déclencher et ne le remarquerez peut-être pas avant d'essayer de restaurer votre sauvegarde. Alors c'est trop tard.Lorsque vous souhaitez utiliser
find
avectar
, la meilleure façon est d'utiliser à lacpio
place detar
.cpio
peut écrire des archives tar et est conçu pour prendre la liste des fichiers à archiver depuis stdin.Utiliser
find
etcpio
est une approche plus unix-y dans la mesure où vous laissezfind
faire la sélection de fichiers avec toute la puissance dont il dispose, et laissezcpio
faire l'archivage. Il vaut la peine d'apprendre cette utilisation simple decpio
, car vous trouvez facile de résoudre les problèmes contre lesquels vous vous cognez en essayanttar
.la source
-maxdepth
avant-type
.Je ne suis pas sûr de comprendre vos exigences. Si vous souhaitez stocker les fichiers normaux dans
mydir
mais pas dans ses sous-répertoires, la manière la plus simple est d'utiliser zsh, où la correspondance des fichiers normaux uniquement est la simple question d'utiliser le.
qualificatif glob :la source
Vous pouvez même utiliser
find ... -print0
ettar ... --null
directement sans utiliserxargs
du tout.Dans l'exemple donné, l'
--no-recursion
option totar
n'est pas nécessaire car seuls les chemins des fichiers (et non des répertoires) seront passés defind
àtar
.Toutefois, l'utilisation de l'
--no-recursion
optiontar
dans l'exemple suivant empêche letar
double archivage des répertoires.find
fera la récursion de l'arborescence de répertoires au lieu detar
alors.la source
Comme le dit le paragraphe d'introduction
man tar
(dernière phrase),Ce que je comprends comme une réponse «non» à votre question.
la source
--no-recursion
,--exclude-tag
etc.). Je regarde--exclude-tag
ce qui semble prometteur mais semble être l'exact opposé de ce que je recherche.Omettre
-C startdir
et remplacer.
parstartdir
s'il doit apparaître dans l'archive.Il s'agit de la méthode la plus efficace basée sur les fonctionnalités de libfind. Libfind propose également des primaires
-chown
-chgrp
-chmod
qui modifient la stat struct en place et permettent d'archiver différentes métadonnées. Cela fonctionne également en mode liste et extraction et évite d'avoir à extraire l'archive entière dans de nombreux cas.la source
-find
en-copy
mode. Le synopsis de la page de manuel suggère que vous pouvez, mais je n'ai pas pu le faire fonctionner (en essayant de répondre Comment copier des fichiers modifiés tout en préservant la structure des dossiers ) (avec schily-2016-02-10)star -find
.J'aurais peut-être trouvé une solution.
find mydir -type f -printf '%P\0'|tar czvf mydir.tar.gz -C mydir --null -T -
Cela peut être un peu coûteux, mais de toute façon cela fonctionnera, car cela ne dépend pas de xargs.
la source
dir = your_dir; cd $ dir; tar -cvf file.tar `find. -maxdepth 1 -type f -print`
la source