Comment puis-je concaténer des fichiers dans un sous-répertoire avec Unix find execute et cat dans un seul fichier?
Je peux le faire:
$ find .
.
./b
./b/foo
./c
./c/foo
Et ce:
$ find . -type f -exec cat {} \;
This is in b.
This is in c.
Mais pas cette:
$ find . -type f -exec cat > out.txt {} \;
Pourquoi pas?
source d'informationauteur JR Lawhorne
Vous devez vous connecter pour publier un commentaire.
des find -exec argument exécute la commande, vous indiquez une seule fois pour chaque fichier trouvé. Essayez:
ou:
xargs convertit son entrée standard dans les arguments de ligne de commande pour la commande que vous spécifiez. Si vous êtes inquiet au sujet des espaces dans les noms de fichiers, essayez:
Hmm... trouver semble être recursing comme vous sortie out.txt pour le répertoire courant
Essayer quelque chose comme
Vous pourriez faire quelque chose comme ceci :
Que diriez-vous simplement de rediriger la sortie de la trouver dans un fichier, car tous vous êtes désireux de le faire est le chat tous les fichiers en un seul gros fichier:
Vous avez peut-être inférée à partir de l'autre les réponses que le
>
symbole est interprétée par le shell avant de trouver la reçoit comme argument. Mais pour répondre à votre "pourquoi pas" permet de regarder votre commande, qui est:Donc, vous êtes de donner
find
ces arguments:"." "-type" "f" "-exec" "cat"
vous donnez le rediriger ces arguments:"out.txt" "{}"
et";"
. Cela confondfind
par pas de résiliation de l'-exec
arguments avec un point-virgule et non pas en utilisant le nom de fichier comme argument ("{}"), il est possible qu'il confond la redirection de trop.En regardant les autres suggestions que vous devriez vraiment éviter de créer de la sortie dans le même répertoire que vous avez trouver en. Mais ils avaient de travailler avec cela à l'esprit. Et le
-print0 | xargs -0
combinaison est très utile. Ce que vous vouliez type était probablement plus comme:Maintenant, si vous avez vraiment seulement un niveau de sous répertoires et uniquement les fichiers normaux, vous pouvez faire quelque chose de stupide et simple comme ceci:
Qui obtient
ls
à la liste de tous vos fichiers et répertoires ajoutant'/'
pour les répertoires, tandis quesed
ajouter un'*'
pour les répertoires. Le shell va alors interpréter cette liste et d'élargir les globules. En supposant que n'a pas en trop grand nombre de fichiers pour la coque de la poignée, ce seront tous passés comme arguments à chat, et la sortie est écrite à out.txt.Ou tout simplement laisser les trouver ce qui est inutile si vous utilisez le vraiment grand Z shell (
zsh
), et vous pouvez faire ceci:(ce doit être dans votre
.zshrc
)Alors:
fonctionne bien 🙂
Essayez ceci:
En bash, vous pourriez faire
$ (), vous pouvez obtenir la sortie d'une commande et de passer à une autre