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ć find
zamiast cat
polecenia.
cat
.Odpowiedzi:
find
Narzędzie zajmuje się ścieżek. Jeśli wfind
poleceniu 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-exec
dofind
polecenia: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,
cat
wywołano by konkatenację zawartości plików.Dane wyjściowe zostaną przekazane do
/home/fifa/cbs/test.txt
.Związane z:
źródło
Wyjście
find
spowoduje z odpowiednimi nazwami plików.Możesz potokować (
|
) wyjście, doxargs cat
którego wykonacat
polecenie na każdym pliku.na przykład:
Inną opcją będzie użycie
-exec cat
źródło
-exec cat {} \;
i-exec -cat {} +
. Nawiasem mówiąc, wielkie dzięki Yaron.find -print0 | xargs -0
nie jest wrażliwy na spacje / cytaty / itp.-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, żefind|xargs
jest 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śxargs
wersję, gdy pamięć podręczna dysku była zimna?