Jak mogę wydrukować zawartość zamiast nazwy pliku za pomocą polecenia linux find?

10

Mam tysiące plików unl o nazwie coś takiego cbs_cdr_vou_20180624_603_126_239457.unl. Chciałem wydrukować wszystkie wiersze z tych plików za pomocą następującego polecenia. ale daje mi tylko nazwy plików. Nie potrzebuję nazw plików, potrzebuję tylko treści z tych plików.

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

Wyjście prądowe:

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

Oczekiwany wynik:

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

Zauważ, że w przypadku polecenia cat pojawia się błąd -bash: /bin/logger: Argument list too long, dlatego właśnie chciałem użyć findzamiast catpolecenia.

Rezuan
źródło
Nadal musisz użyć cat.
Ignacio Vazquez-Abrams
Tak! Czy możesz mi powiedzieć, jak to zrobić? @ IgnacioVazquez-Abrams
Rezuan

Odpowiedzi:

28

findNarzędzie zajmuje się ścieżek. Jeśli w findpoleceniu nie znaleziono żadnej konkretnej akcji dla znalezionych ścieżek, domyślną akcją jest ich wyprowadzenie.

Możesz wykonać akcję na znalezionych nazwach ścieżek, na przykład uruchomić cat, dodając -execdo findpolecenia:

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

Znajduje to wszystkie zwykłe pliki w bieżącym katalogu lub pod nim, których nazwy pasują do podanego wzorca. W przypadku tak dużych partii, jak to możliwe, catwywołano by konkatenację zawartości plików.

Dane wyjściowe zostaną przekazane do /home/fifa/cbs/test.txt.

Związane z:

Kusalananda
źródło
1
Działa zgodnie z oczekiwaniami, a czas realizacji jest bardzo szybki, co jest naprawdę świetne. Wielkie dzięki.
Rezuan
12

Wyjście findspowoduje z odpowiednimi nazwami plików.
Możesz potokować ( |) wyjście, do xargs catktórego wykona catpolecenie na każdym pliku.

na przykład:

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

Inną opcją będzie użycie -exec cat

find -type f -name 'cbs_cdr_vou_20180615*.unl'  -exec cat {} \;  > /home/fifa/cbs/test.txt
Yaron
źródło
4
Oba polecenia działają dobrze. Ale nieco wolniej niż rozkaz Kusalanandy . Chyba czas wykonania zależy od -exec cat {} \;i -exec -cat {} +. Nawiasem mówiąc, wielkie dzięki Yaron.
Rezuan
xargs jest podatny na spacje w znalezionych nazwach ścieżek; -exec cat {} nie jest
jez
2
find -print0 | xargs -0nie jest wrażliwy na spacje / cytaty / itp.
puszysty
1
@Rezuan: -exec cat {} \;uruchamia kota osobno dla każdego pliku zamiast grupować je razem, jak xargs. Nie używaj go, chyba że wyraźnie tego chcesz (np. Polecenie, które działa tylko dla jednego pliku na raz) lub jeśli potrzebujesz przenośności do systemu -exec ... +bez -print0/ bez / xargs -0. Jestem jednak nieco zaskoczony, że find|xargsjest to wymiernie wolniejsze niż -exec cat {} +. Czy masz bardzo mało wszystkich plików, więc narzut związany z uruchomieniem wiąże się z dużymi kosztami? Czy może tylko czas sprawdziłeś xargswersję, gdy pamięć podręczna dysku była zimna?
Peter Cordes
1
@PeterCordes dzięki za wyjaśnienie. Zrozumiałem później, że chodzi o pamięć podręczną dysku.
Rezuan