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 long
c'est pourquoi je voulais utiliser à la find
place de la cat
commande.
cat
.Réponses:
L'
find
utilitaire traite les noms de chemin. Si aucune action spécifique n'est mentionnée dans lafind
commande 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
à lafind
commande: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,
cat
serait appelé pour concaténer le contenu des fichiers.La sortie irait à
/home/fifa/cbs/test.txt
.En relation:
la source
La sortie de
find
résultera avec les noms de fichiers appropriés.Vous pouvez diriger (
|
) la sortie versxargs cat
laquelle exécutera lacat
commande sur chaque fichier.par exemple:
Une autre option sera d'utiliser
-exec cat
la source
-exec cat {} \;
et-exec -cat {} +
. Au fait, merci beaucoup Yaron.find -print0 | xargs -0
n'est pas vulnérable aux espaces / guillemets / etc.-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 cefind|xargs
soit 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é laxargs
version alors que votre cache disque était froid?