Pourquoi ça ne marche pas?
ls *.txt | xargs cat > all.txt
(Je veux joindre le contenu de tous les fichiers texte dans un seul fichier 'all.txt'.) Find avec -exec devrait également fonctionner, mais j'aimerais vraiment comprendre la syntaxe xargs.
Merci
ls
pour cela . Si vous ne pouvez vraiment pas l'utiliser,cat *.txt >all.txt
essayezprintf '%s\0' *.txt | xargs -r0 cat >all
ensuitemv all all.txt
d'éviter de référencer le fichier lui-même.Réponses:
ls *.txt | xargs cat >> all.txt
pourrait fonctionner un peu mieux, car il s'ajouterait à all.txt au lieu de le recréer après chaque fichier.
Soit dit en passant,
cat *.txt >all.txt
fonctionnerait également. :-)la source
Si certains de vos noms de fichiers contiennent ', "ou l'espace
xargs
échouera à cause du problème du séparateurEn général, ne courez jamais
xargs
sans -0 car il reviendra et vous mordra un jour.Pensez à utiliser GNU Parallel à la place:
ou si vous préférez:
En savoir plus sur GNU Parallel http://www.youtube.com/watch?v=OpaiGYxkSuQ
la source
all.txt
est un fichier dans le même répertoire, donc cat devient confus quand il veut écrire du même fichier dans le même fichier.D'autre part:
Cela lira des fichiers texte de votre répertoire actuel dans le all.txt dans un sous-répertoire (non inclus avec
*.txt
).la source
Vous pouvez également rencontrer une limitation de longueur de ligne de commande. Une partie de la raison de son utilisation
xargs
est qu'il divise l'entrée en blocs sécurisés de la taille d'une ligne de commande. Imaginez donc une situation dans laquelle vous avez des centaines de milliers de fichiers .txt dans le répertoire.ls *.txt
échouera. Vous auriez besoin de faire.txt$
dans ce cas est une expression régulière correspondant à tout ce qui se termine par .txt (donc ce n'est pas exactement comme*.txt
, car si vous avez un fichier appeléatxt
, alors*.txt
il ne correspondrait pas, mais l'expression régulière le ferait.)L'utilisation d'un autre chemin est due au fait que, comme d'autres réponses l'ont souligné, all.txt est mis en correspondance par le modèle, de
*.txt
sorte qu'il y aurait un conflit entre l'entrée et la sortie.Notez que si vous avez des fichiers avec
'
leur nom (et cela peut être la cause de l'unmatched single quote
erreur), vous voudrez faireL'option --null indique à grep d'utiliser une sortie séparée par un caractère
\0
(aka null) au lieu de la nouvelle ligne par défaut, et l'-0
option de `xargs lui dit d'attendre son entrée dans le même format. Cela fonctionnerait même si vous aviez des noms de fichiers avec des retours à la ligne.la source