Jak używać polecenia „cat” na wyjściu polecenia „find”?


13

Chcę przekierować dane wyjściowe findpolecenia do catpolecenia, aby móc wydrukować dane z danego pliku.

Na przykład jeśli wynikiem działania polecenia find jest /aFile/readmekot, należy go interpretować jako cat ./aFile/readme. Jak mogę to zrobić natychmiast?

Czy muszę używać rur?

Próbowałem wersji tego:

cat | find ./inhere -size 1033c 2> /dev/null

Ale myślę, że to całkowicie źle? Oczywiście jestem pewien, że dane wyjściowe to tylko jeden plik, a nie wiele plików.

Jak mogę to zrobić? Szukałem w Google i nie mogłem znaleźć rozwiązania, prawdopodobnie dlatego, że nie szukałem dobrze: P

Odpowiedzi:


21

Możesz to zrobić findsam, korzystając z -execakcji:

find /location -size 1033c -exec cat {} +

{}zostaną rozszerzone do znalezionych plików i +umożliwią odczytanie jak największej liczby argumentów dla każdego wywołania cat, ponieważ cat może przyjąć wiele argumentów.

Jeśli findnie masz +rozszerzenia lub chcesz czytać pliki jeden po drugim:

find /location -size 1033c -exec cat {} \;

Jeśli chcesz użyć dowolnej opcji cat, wykonaj:

find /location -size 1033c -exec cat -n {} +
find /location -size 1033c -exec cat -n {} \;

Korzystam z -nopcji, aby uzyskać numery linii.


Więc jeśli mam rację: {} jest jak zmienna, w której jest przechowywany wynik polecenia find, a po znaku „+” należy zapisać parametry cat? Nie? Edytuj: W porządku, edytowałeś swój post, a teraz właśnie odpowiedziałeś na moje pytanie: P Thanx man! Rozwiązany !
— Eksapsy

@ general656 Sprawdź moje zmiany ..
— heemayl

1
Fakt, że nie wiedział o cat„s -nopcją mnie zaskakuje. Uwielbiam czytać losowe pytania.
— mazunki

1

Zmiana polecenia

Inną opcją jest użycie polecenia Podstawienie . Zawijanie polecenia $()spowoduje uruchomienie polecenia i zastąpienie polecenia jego wynikiem.

cat $(find ./inhere -size 1033c 2> /dev/null)

stanie się

cat ./inhere/file1 .inhere/file3

Jest to mniej więcej równoważne użyciu starszego stylu zawijania poleceń za pomocą tykania wstecz:

cat `find ./inhere -size 1033c 2> /dev/null`

Więcej szczegółów z dokumentów powiązanych powyżej

Bash wykonuje rozwinięcie, wykonując polecenie w środowisku podpowłoki i zastępując podstawienie polecenia standardowym wyjściem polecenia, usuwając wszelkie końcowe znaki nowej linii. Osadzone znaki nowej linii nie są usuwane, ale mogą być usuwane podczas dzielenia słów. Podstawienie polecenia $(cat file)można zastąpić równoważnym, ale szybszym $(< file).

Gdy stosuje się w starym stylu postać backquote podstawienia, ukośnikowe zachowuje dosłownym znaczeniu, z wyjątkiem, gdy następnie $, `albo \. Pierwszy cudzysłów nie poprzedzony odwrotnym ukośnikiem kończy podstawianie poleceń. Podczas korzystania z $(command)formularza wszystkie znaki między nawiasami tworzą polecenie; żaden nie jest traktowany specjalnie.

Podstawienia poleceń mogą być zagnieżdżone. Aby zagnieżdżać się podczas korzystania z formularza z cudzysłowem, unikaj wewnętrznych cudzysłowów za pomocą odwrotnych ukośników.

Jeśli podstawienie pojawia się w podwójnym cudzysłowie, dzielenie słów i rozwijanie nazw plików nie są wykonywane w wynikach.

Zobacz inną odpowiedź na kilka dobrych przykładów użycia.


Zauważ, że jeśli findznajdzie zbyt wiele plików, wygeneruje to błąd „zbyt długiej listy argumentów” przy próbie wywołania cat. Miałby również problemy z obsługą nazw plików zawierających znaki białych znaków i być może również nazw plików zawierających znaki globowania nazw plików.
— Kusalananda

0

Spowoduje to wydrukowanie rekursywnie nazwy i treści plików tekstowych (ascii).

find . -type f -exec grep -Iq . {} \; -print | xargs awk 'FNR==1{print FILENAME ":" $0; }'

Jeszcze jedna próba

find . -type f -exec grep -Iq . {} \; -printf "\n%p:" -exec cat {} \;

-2

Użyj potoku i xargs

find /* -name pg_hba.conf | xargs cat

Jeśli zakończy się niepowodzeniem z powodu braku uprawnień, możesz użyć sudo, aby upewnić się, że masz uprawnienia do wykonania polecenia find w przeszukiwanym katalogu.

 sudo find /* -name pg_hba.conf | xargs sudo cat

1
A jeśli ktoś utworzy plik o nazwie /tmp/ /dev/urandom /pg_hba.conf, pozwoli to rootowi zrzucić całą zawartość /dev/urandom. Gorzej można prawdopodobnie zrobić w zależności od kontekstu. xargsprawie nigdy nie powinien być używany bez -0. Również sudo xargsbyłoby lepiej niż xargs sudo. I /*byłoby lepiej jak /.
— Stéphane Chazelas

1
OP chce użyć cat do wydrukowania zawartości pliku na standardowym wyjściu. Tak więc cel służy kotowi. Pytanie brzmi: jak użyć cat z polecenia out put of find do wydrukowania zawartości pliku, a nie jak używać sudo lub find. Powyższe polecenie rozwiązuje pytanie. Tak, xargs -0 był jedyną konstruktywną rzeczą, którą wskazałeś. Ale nie pokazał użycia. Staraj się nie być niegrzeczny.
— App Work

Przepraszam, jeśli to wydawało się niegrzeczne. To nie była intencja. Chciałem zwrócić uwagę na ograniczenia. Twoja odpowiedź pokazuje złe praktyki ( find|xargsbez -0tego naprawdę powinna zostać zbanowana), stąd głosowanie negatywne . Wyjście findbez -print0nie jest niezawodnie przetwarzalne. -print0nie jest standardem. Powiedziawszy to, standard sudo find / -name pg_hba.conf -exec cat {} +może również sprawić, że zrzucisz zawartość /dev/urandom(na przykład, jeśli ktoś utworzy do niego dowiązanie symboliczne /tmp/pg_hba.confi nie ma łatwego przenośnego sposobu na obejście tego, który przynajmniej nie ma warunków wyścigu).
— Stéphane Chazelas

1
Nie używajmy sudo„na wszelki wypadek”, prawda?
— 2017

Cóż, to lepsze niż bieganiesudo rm -rf /
— devinbost
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.