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

Eksapsy
źródło

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.

heemayl
źródło
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.

WhiteHotLoveTiger
źródło
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 {} \;
Prashant Adlinge
źródło
-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
Praca aplikacji
źródło
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