Rozważmy kilka popularnych systemów * nix (na przykład Debian, CentOS, Arch i Kali).
Zawsze używany find
; Nie przypominam sobie używania GNU find, ale z jednego przykładu Widziałem, że zakładałem, że składnia GNU find może być prostsza (chociaż może zezwalać na mniej operacji).
Mam dwa pytania:
-
Czy
find
jest domyślnym narzędziem „znajdź lub-i operuj” w typowych systemach, czy też systemy będą wyposażone wfind
iGNU find
? -
Czy
GNU find
powinno być prostsze niżfind
?
Komentarze
Odpowiedź
Narzędzia GNU często implementują standard POSIX, a następnie rozszerzają go o dodatkowe funkcje dla większej wygody (i, z drugiej strony, zmniejszona przenośność między Unikami). Aspekt przenośności jest powodem, dla którego czasami zobaczysz odpowiedzi lub komentarze na tej stronie, które bardzo uważnie wskazują, kiedy zakłada się narzędzie GNU lub inną konkretną implementację narzędzia.
Jeśli używasz Linuksa system, bardzo użyłbyś implementacji GNU find
i prawdopodobnie nie miałbyś innego find
zainstalowany. W systemach innych niż Linux miałbyś natywny find
i możliwość zainstalowania GNU find
(który najczęściej był instalowany w name gfind
lub, rzadziej, gnufind
).
Podobnie jak w przypadku większości narzędzi GNU, GNU find
implementuje i rozszerza standardową find
specyfikację . Dlatego nie jest to „prostsze”, ale prawdopodobnie bardziej złożone, aby było wygodniejsze, i byłoby nieco łatwiejsze do wykonania z nim pewnych złożonych zadań niż przy użyciu ściśle zgodnego ze standardami find
.
Rozszerzone implementacje find
często, na przykład, implementują -maxdepth
i -mindepth
predykaty, o których norma nie wspomina, a GNU find
w szczególności ma również -printf
do wydrukowania znalezionych ścieżek za pomocą różnorodne możliwości formatowania (standardowa find
nie ma -printf
) i predykatów do dopasowywania różnych typów wyrażeń regularnych w nazwach ścieżek, a także szereg innych niestandardowych predykatów, z których niektóre można również znaleźć w innych implementacjach find
(prawdopodobnie z nieco inną semantyką, np. -execdir
whi ch działa nieco inaczej w zależności od tego, co find
jest używane 1 ).
-delete
predykat, używany w odpowiedzi, do której tworzysz łącze, jest niestandardowy, ale zaimplementowany przez GNU find
, a także w find
w niektórych innych systemach innych niż Linux. GNU find
„s -delete
będzie narzekać, jeśli użyjesz go do usunięcia niepustego katalogu, ale odpowiednią opcję z np. OpenBSD” s find
nie (ani nie usunie niepustego katalogu).
Większość systemów Linux, niezależnie od dystrybucji, używa tych samych narzędzi coreutils i findutils (warianty takie jak oczywiście busybox istnieje). Aby użyć zupełnie innego zestawu implementacji narzędzi, musiałbyś przejść na jeden z systemów BSD typu open source lub na macOS, Solaris, AIX lub inny komercyjny Unix.
1 GNU find
dodaje ./
na początku do nazw ścieżek, gdy używasz -execdir
podczas niektóre inne implementacje nie „t.
Komentarze
- I
-print0
i-direxec
i-delete
i … ;-). Opcje separatora zerowego dostępne w narzędziach GNU są szczególnie wygodne. - @StephenKitt Ale rzadko potrzebne 🙂
- dobrze, z wyjątkiem sytuacji, gdy piszemy tutaj odpowiedzi spoza POSIX ;-). (Lub skrypty, które muszą działać gdziekolwiek .)
- Głównym problemem związanym z dokumentacją GNU jest to, że próbuje ona pozwolić ludziom używać niestandardowych aliasów do metod POSIX i tym samym powodować powiązane skrypty do tworzenia blokady dostawcy.
- @StephenKitt
-print0
jest również dostępny na * bsd i solaris; ale na solarisxargs -0
nie ' nie działa, więcgxargs -0
(z ).
Odpowiedź
Co ludzie często mówią ponieważ Linux jest lepiej określany jako GNU / Linux: Linux plus GNU. Dlatego narzędzia, których używasz, to prawdopodobnie GNU.
- Linux: jądro, jest używane w systemach GNU / Linux, Android i wielu innych.
- GNU: an system operacyjny, często używany z jądrem Linuksa, ale może być również używany z BSD, Hurd, Cygwin (biblioteka DLL dla Microsoft Windows, udaje jądro), WSL (podsystem Windows dla Linuksa: GNU bez Linuksa, włączony Microsoft Windows), HPUX, Solaris, Dec Athena i wiele innych.
Dlatego prawdopodobnie używasz GNU find.
GNU to projekt, który write, Bezpłatna (bezpłatna jak wolność, a nie cena) wersja całego systemu Unix, w tym narzędzi takich jak find
, projekt GNU nie martwi się o zgodność z POSIX: będzie zgodny tam, gdzie ma to sens, ale także wprowadzi ulepszenia.
Zakładasz również, że istnieje tylko jeden find
jest błędny.
find
na busybox lub Android 😉 W systemach innych niż linux, GNU find ma zwykle nazwęgfind
.find --version
😉find
w tych systemach to GNUfind
.