Chcę przekierować dane wyjściowe find
polecenia do cat
polecenia, aby móc wydrukować dane z danego pliku.
Na przykład jeśli wynikiem działania polecenia find jest /aFile/readme
kot, 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
cat
„s-n
opcją mnie zaskakuje. Uwielbiam czytać losowe pytania.Zmiana polecenia
Inną opcją jest użycie polecenia Podstawienie . Zawijanie polecenia
$()
spowoduje uruchomienie polecenia i zastąpienie polecenia jego wynikiem.stanie się
Jest to mniej więcej równoważne użyciu starszego stylu zawijania poleceń za pomocą tykania wstecz:
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.
źródło
find
znajdzie zbyt wiele plików, wygeneruje to błąd „zbyt długiej listy argumentów” przy próbie wywołaniacat
. 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.Spowoduje to wydrukowanie rekursywnie nazwy i treści plików tekstowych (ascii).
Jeszcze jedna próba
źródło
Użyj potoku i xargs
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.
źródło
/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.xargs
prawie nigdy nie powinien być używany bez-0
. Równieżsudo xargs
byłoby lepiej niżxargs sudo
. I/*
byłoby lepiej jak/
.find|xargs
bez-0
tego naprawdę powinna zostać zbanowana), stąd głosowanie negatywne . Wyjściefind
bez-print0
nie jest niezawodnie przetwarzalne.-print0
nie jest standardem. Powiedziawszy to, standardsudo 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.conf
i nie ma łatwego przenośnego sposobu na obejście tego, który przynajmniej nie ma warunków wyścigu).sudo
„na wszelki wypadek”, prawda?sudo rm -rf /