Wie kann ich Inhalte anstelle des Dateinamens mit dem Befehl Linux find drucken?

10

Ich habe Tausende von unl-Dateien mit dem Namen so etwas cbs_cdr_vou_20180624_603_126_239457.unl. Ich wollte alle Zeilen aus diesen Dateien mit dem folgenden Befehl drucken. aber es gibt mir nur Dateinamen. Ich brauche keine Dateinamen, ich brauche nur Inhalte aus diesen Dateien.

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

Aktueller Output:

./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

Erwartete Ausgabe:

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|;

Bitte beachten Sie, dass für den Befehl cat eine Fehlermeldung angezeigt wird -bash: /bin/logger: Argument list too long, weshalb ich findanstelle des catBefehls verwenden wollte.

Rezuan
quelle
Sie müssen noch verwenden cat.
Ignacio Vazquez-Abrams
Ja! Können Sie mir bitte sagen, wie ich das machen kann? @ IgnacioVazquez-Abrams
Rezuan

Antworten:

28

Das findDienstprogramm befasst sich mit Pfadnamen. Wenn im findBefehl für die gefundenen Pfadnamen keine bestimmte Aktion angegeben ist, werden sie standardmäßig ausgegeben.

Sie können eine Aktion für die gefundenen Pfadnamen ausführen, z. B. Ausführen cat, indem Sie -execdem findBefehl Folgendes hinzufügen :

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

Dies würde alle regulären Dateien im oder unter dem aktuellen Verzeichnis finden, deren Namen mit dem angegebenen Muster übereinstimmen. Für so große Stapel wie möglich catwürde aufgerufen, den Inhalt der Dateien zu verketten.

Die Ausgabe würde zu gehen /home/fifa/cbs/test.txt.

Verbunden:

Kusalananda
quelle
1
Das Arbeiten wie erwartet und die Ausführungszeit sind sehr schnell, was wirklich großartig ist. Danke vielmals.
Rezuan
12

Die Ausgabe von findergibt die entsprechenden Dateinamen.
Sie können |die Ausgabe, an xargs catdie der catBefehl für jede Datei ausgeführt wird, weiterleiten ( ) .

z.B:

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

Eine weitere Option ist die Verwendung -exec cat

find -type f -name 'cbs_cdr_vou_20180615*.unl'  -exec cat {} \;  > /home/fifa/cbs/test.txt
Yaron
quelle
4
Beide Befehle funktionieren einwandfrei. Aber etwas langsamer als Kusalanandas Befehl. Ich denke, die Ausführungszeit variiert auf -exec cat {} \;und -exec -cat {} +. Übrigens, vielen Dank Yaron.
Rezuan
xargs ist anfällig für Leerzeichen in gefundenen Pfadnamen. -exec Katze {} ist nicht
jez
2
find -print0 | xargs -0ist nicht anfällig für Leerzeichen / Anführungszeichen / etc.
flauschig
1
@Rezuan: Führt -exec cat {} \;cat für jede Datei separat aus, anstatt sie wie xargs zu stapeln. Verwenden Sie es nur, wenn Sie dies ausdrücklich möchten (z. B. einen Befehl, der jeweils nur für eine Datei funktioniert) oder wenn Sie eine Portabilität auf ein System ohne -exec ... +und ohne -print0/ benötigen xargs -0. Ich bin ein bisschen überrascht, dass find|xargsdas messbar langsamer ist als -exec cat {} +. Haben Sie nur sehr wenige Dateien insgesamt, sodass der Startaufwand einen großen Teil der Kosten ausmacht? Oder haben Sie die xargsVersion nur zeitlich festgelegt, während Ihr Festplatten-Cache kalt war?
Peter Cordes
1
@ PeterCordes danke für die Erklärung. Es war für den Festplatten-Cache, wie ich später erkannte.
Rezuan