Comment puis-je imprimer le contenu au lieu du nom de fichier en utilisant la commande linux find?

10

J'ai des milliers de fichiers unl nommés quelque chose comme ça cbs_cdr_vou_20180624_603_126_239457.unl. Je voulais imprimer toutes les lignes de ces fichiers en utilisant la commande suivante. mais ça ne me donne que des noms de fichiers. Je n'ai pas besoin de noms de fichiers, j'ai juste besoin du contenu de ces fichiers.

find -type f -name 'cbs_cdr_vou_20180615*.unl'  > /home/fifa/cbs/test.txt

Sortie actuelle:

./cbs_cdr_vou_20180615_603_129_152023.unl
./cbs_cdr_vou_20180615_603_128_219001.unl
./cbs_cdr_vou_20180615_602_113_215712.unl
./cbs_cdr_vou_20180615_602_120_160466.unl
./cbs_cdr_vou_20180615_603_125_174428.unl
./cbs_cdr_vou_20180615_601_101_152369.unl
./cbs_cdr_vou_20180615_603_133_193306.unl

Production attendue:

8801865252020|200200|20180613100325|;
8801837463298|200200|20180613111209|;
8801845136955|200200|20180613133708|;
8801845205889|200200|20180613141140|;
8801837612072|200200|20180613141525|;
8801877103875|200200|20180613183008|;
8801877167964|200200|20180613191607|;
8801845437651|200200|20180613200415|;
8801845437651|200200|20180613221625|;
8801839460670|200200|20180613235936|;

Veuillez noter que, pour la commande cat, j'obtiens une erreur comme -bash: /bin/logger: Argument list too longc'est pourquoi je voulais utiliser à la findplace de la catcommande.

Rezuan
la source
Vous devez toujours utiliser cat.
Ignacio Vazquez-Abrams
Oui! Pouvez-vous me dire comment puis-je faire cela? @ IgnacioVazquez-Abrams
Rezuan

Réponses:

28

L' findutilitaire traite les noms de chemin. Si aucune action spécifique n'est mentionnée dans la findcommande pour les chemins d'accès trouvés, l'action par défaut consiste à les sortir.

Vous pouvez effectuer une action sur les chemins d'accès trouvés, telle que l'exécution cat, en ajoutant -execà la findcommande:

find . -type f -name 'cbs_cdr_vou_20180615*.unl' -exec cat {} + >/home/fifa/cbs/test.txt

Cela trouverait tous les fichiers normaux dans ou sous le répertoire courant, dont les noms correspondent au modèle donné. Pour des lots aussi importants que possible de ces derniers, catserait appelé pour concaténer le contenu des fichiers.

La sortie irait à /home/fifa/cbs/test.txt.

En relation:

Kusalananda
la source
1
Travailler comme prévu et le temps d'exécution est très rapide, ce qui est vraiment génial. Merci beaucoup.
Rezuan
12

La sortie de findrésultera avec les noms de fichiers appropriés.
Vous pouvez diriger ( |) la sortie vers xargs catlaquelle exécutera la catcommande sur chaque fichier.

par exemple:

find -type f -name 'cbs_cdr_vou_20180615*.unl' | xargs cat  > /home/fifa/cbs/test.txt

Une autre option sera d'utiliser -exec cat

find -type f -name 'cbs_cdr_vou_20180615*.unl'  -exec cat {} \;  > /home/fifa/cbs/test.txt
Yaron
la source
4
Vos deux commandes fonctionnent bien. Mais un peu plus lent que le commandement de Kusalananda . Je suppose que le temps d'exécution varie sur -exec cat {} \;et -exec -cat {} +. Au fait, merci beaucoup Yaron.
Rezuan
xargs est vulnérable aux espaces dans les chemins d'accès trouvés; -exec cat {} n'est pas
jez
2
find -print0 | xargs -0n'est pas vulnérable aux espaces / guillemets / etc.
moelleux
1
@Rezuan: -exec cat {} \;exécute cat séparément pour chaque fichier au lieu de les regrouper comme des xargs. Ne l'utilisez pas sauf si vous le souhaitez explicitement (par exemple une commande qui ne fonctionne que pour un fichier à la fois), ou si vous avez besoin de portabilité vers un système sans -exec ... +et sans -print0/ xargs -0. Je suis un peu surpris que ce find|xargssoit beaucoup plus lent que -exec cat {} +cela. Avez-vous très peu de fichiers au total, donc les frais généraux de démarrage représentent une grande partie du coût? Ou avez-vous uniquement chronométré la xargsversion alors que votre cache disque était froid?
Peter Cordes
1
@PeterCordes merci pour l'explication. C'était pour le cache disque, je m'en suis rendu compte plus tard.
Rezuan