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. :-)
Si certains de vos noms de fichiers contiennent ', "ou l'espace xargs
échouera à cause du problème du séparateur
En général, ne courez jamais xargs
sans -0 car il reviendra et vous mordra un jour.
Pensez à utiliser GNU Parallel à la place:
ls *.txt | parallel cat > tmp/all.txt
ou si vous préférez:
ls *.txt | parallel cat >> tmp/all.txt
En savoir plus sur GNU Parallel http://www.youtube.com/watch?v=OpaiGYxkSuQ
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:
ls *.txt | xargs cat > tmp/all.txt
Cela lira des fichiers texte de votre répertoire actuel dans le all.txt dans un sous-répertoire (non inclus avec *.txt
).
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
ls | grep .txt$ |xargs cat > /some/other/path/all.txt
.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 faire
ls | grep --null .txt$ | xargs -0 cat > /some/other/path/all.txt
L'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.
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.