Jaka jest różnica między znajdowaniem. i znajdź . -wydrukować


27

Jaka jest różnica pomiędzy:

find .

i

find . -print

Co -printwłaściwie robi?

$ find .
.
./hello.txt
./hello
./hello/txt
./hello/hello2
./hello/hello2/hello3
./hello/hello2/hello3/txt
./hello/hello2/txt
$ find . -print
.
./hello.txt
./hello
./hello/txt
./hello/hello2
./hello/hello2/hello3
./hello/hello2/hello3/txt
./hello/hello2/txt

Odpowiedzi:


41

Z strony findutils findpodręcznika :

Jeśli nie podano żadnego wyrażenia, -printużywane jest wyrażenie (ale prawdopodobnie powinieneś rozważyć użycie -print0zamiast tego).

( -printjest findwyrażeniem.)

Dokumentacja POSIX potwierdza to:

Jeśli nie ma wyrażenia , jako wyrażenie należy użyć opcji -print .

find .Jest więc dokładnie równoważne z find . -print; pierwszy nie ma wyrażenia, dlatego -printjest dodawany wewnętrznie.

Wyjaśnienie tego, co -printdzieje się dalej na stronie podręcznika:

-print

Prawdziwe; wypisz pełną nazwę pliku na standardowym wyjściu, a następnie nowy wiersz. Jeśli przesyłasz dane wyjściowe polecenia find do innego programu i istnieje niewielka szansa, że ​​pliki, których szukasz, mogą zawierać nowy wiersz, powinieneś poważnie rozważyć skorzystanie z -print0opcji zamiast -print. Zobacz sekcję NIEZWYKŁE PLIKI, aby uzyskać informacje na temat obsługi nietypowych znaków w nazwach plików.


Coś w rodzaju pytania dla początkującego, ale o jakim wyrażeniu mówisz? to jest wyrażenie regularne?
Rishi Prakash,

2
@Rishi zobacz stronę podręcznika .
Stephen Kitt,

20

-printjest domyślną akcją . Niektóre findpredykaty są traktowane jako działania w przeciwieństwie do filtrów lub warunków . Na przykład -type fnie jest działaniem. -execjest działaniem, nawet jeśli może być również użyte jako warunek.

Działania obejmują -print, -execi -ok. Niektóre findimplementacje mają inne niestandardowe działania Podobnie jak predykaty -print0, -printf, -execdir, -okdir, -ls...

find files <some-predicates>

Jeżeli żadne działanie<some-predicates> zawierające nie jest równoważne z:

find files \( <some-predicates> \) -print

(zwróć uwagę na nawiasy powyżej, które są ważne, jeśli istnieją -ooperatory).

W razie wątpliwości najlepiej jest użyć -printjawnie (lub -exec printf '%s\0' {} +(lub -print0jeśli są dostępne), aby dane wyjściowe mogły zostać przetworzone później).

Domyślną -printakcję określa POSIX. Niektóre stare findimplementacje wymagały wyraźnego-print , ale obecnie nie można ich znaleźć na wolności.

Zauważ również, że niektóre findimplementacje pozwalają na pominięcie files, w którym to przypadku domyślnie przeszukują bieżący katalog. To dla nich

find

jest równa

find .
find . -print

Nie jest to jednak standardowe, więc najlepiej go unikać.

Na bardziej szczegółowym (i użytecznym) końcu spektrum niektóre findimplementacje pozwalają również na przekazywanie ścieżek plików jako argumentów do -fopcji jak w:

find -f "$file1" -f "$file2" -print

Są to jedyne findimplementacje, które umożliwiają przekazywanie dowolnych ścieżek plików find. Inne implementacje nie akceptują ścieżek plików takich jak !lub -print... więc find "$file" -print(a nawet find -- "$file" -print) zakłada, że $filenie jest to nazwa findpredykatu (lub opcji w pierwszym przypadku).

Niestety to też nie jest standardowe ani przenośne.


Jeśli jest niestandardowy i najlepiej go unikać, po co w ogóle go nazywać?
Izaak

@Isaac, ponieważ mogą się przydać / są możliwe literówki ...
vonbrand


4

W Linuksie nie ma różnicy, ale inne systemy (na przykład AIX) potrzebują, -printjeśli chcesz, aby wynik polecenia był wyświetlany na ekranie.


3
To byłyby wówczas bardzo bardzo stare wersje systemu AIX. AIX 4.3 findgo nie potrzebuje. AIX jest zgodny z POSIX od dziesięcioleci.
Stéphane Chazelas

3

Przez wiele lat polecenie find nie miało domyślnej akcji. Częstym błędem było zapominanie o dodaniu opcji -print do polecenia find. Do dziś piszę to z przyzwyczajenia.

Ale w pewnym momencie została dodana jako akcja domyślna, więc teraz find .i find . -printsą równoważne.


1

Czasami przydaje się -printjawne użycie podczas wykonywania innej akcji, aby nazwa pliku była wyświetlana podczas wykonywania tej akcji.

find . -print -delete

byłoby podobne do

rm -rfv *

gdzie -printodpowiada -v. Jeśli tego nie zrobisz, -printnazwy plików nie będą wyświetlane.

Nawiasem rmmówiąc, aby komenda była jeszcze bardziej podobna, najpierw wydaj tę komendę Bash

shopt -s dotglob

co spowoduje *dopasowanie plików kropek (ukrytych).

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.