J'ai un dossier contenant environ 320116 fichiers .pdb.gz. Je veux tous les décompresser. Si j'utilise gunzip * .gz, cela me donne une erreur, c'est-à-dire une liste d'arguments trop longue. Le dossier fait environ 2 Go. Veuillez me donner une suggestion appropriée.
13
Réponses:
-exec gunzip {} +
fourniragunzip
de nombreux mais pas trop de noms de fichiers sur sa ligne de commande. C'est plus efficace que celui-exec gunzip {} \;
qui démarre un nouveaugunzip
processus pour chaque fichier.la source
find
, moinsgunzip
!find
autorisent la notation "+". Voir, par exemple, lafind
page de manuel de BSD 10.1 . S'applique également à OS X (10.9 et versions ultérieures au moins, peut-être plus tôt).Chaque fois que vous obtenez des erreurs «liste d'arguments trop longue», vous pouvez contourner ce problème en appelant la commande souhaitée plusieurs fois, à chaque fois avec un sous-ensemble des arguments que vous souhaitez utiliser.
xargs
est un outil qui vous aide à le faire automatiquement.la source
-execdir gunzip "{}" \;
que les xargs invoqueront gunzip séparément pour chaque fichier? C'est ma lecture de la page de manuel.xargs
remplira autant de noms de fichiers que possible sur lagunzip
ligne de commande. Essayez!echo a b c d e f | xargs echo
n'appelleecho
qu'une seule fois avec les 6 arguments, vous voyez donc une ligne de sortie (commande assez inutile à exécuter cependant !!!!) tandis que si vous forcezxargs
à ne fournir que 3 arguments par appel de la commande,echo a b c d e f | xargs -n 3 echo
vous obtenez 2 lignes de sortie .xargs
est que, avec l'-P
option, vous pouvez exécuter plusieursgunzip
processus en parallèle, ce qui (en fonction des paramètres exacts de votre système) peut aller plus vite.-P
, @psmears. Maintenant, j'ai aussi appris quelque chose!Je pense que cela devrait fonctionner, il transmet le chemin / nom de chaque fichier individuellement à gunzip pour le traitement:
la source
find
avec+
etxargs
sont expressément concepteur avec exactement ce problème à l'esprit. Ils fourniront toujours autant d'arguments que possible, sans dépasser la limite du système d'exploitation. Parce que, par ailleurs, il est une limite du système d'exploitation, rien à voir avecgunzip
.Essayez de cette façon:
la source
gunzip
une fois par fichier. Voir la réponse de John1024 pour une manière légèrement différente qui évite cette inefficacité.Si vous avez une machine multicœur, vous verrez probablement que l'utilisation
gunzip
ne va pas maximiser les capacités de votre machine. Pour cela, vous devez exécuter plusieursgunzip
s en parallèle. Garder une trace de ce qui est fait dans quel terminal à la main est lourd, mais vous pouvez facilement le faire avec GNU parallel:la source
parallel
est trop longue?find
est trop longue?find
la ligne de commande de.-name
Il n'est pas nécessaire de l'utiliser
find
pour cela, car vous n'avez pas mentionné de sous-dossiers. Ce que vous devez faire, c'est:la source
find
si vous ne voulez pas reproduire 320116gunzip
processus, tout comme cette boucle fait.