Luați în considerare câteva sisteme comune * nix (să zicem Debian, CentOS, Arch și Kali).

Întotdeauna folosit find Nu-mi amintesc să folosesc GNU find, dar din un exemplu am văzut că am presupus că sintaxa GNU find ar putea fi mai simplă (deși ar putea să permită mai puține operații).

Am două întrebări:

  1. Este find utilitarul implicit „găsiți și operați” în sistemele comune sau sistemele vor veni cu ambele find și GNU find?

  2. A fost GNU find destinat să fie mai simplu la find ?

Comentarii

  • întotdeauna ați folosit GNU find pe Linux, cu excepția cazului în care ' este un mare utilizator al find pe busybox sau android 😉 Pe sistemele non-linux, căutarea GNU se numește de obicei gfind.
  • Încercați find --version😉
  • Acele sisteme la care ' faceți referire sunt sisteme GNU, GNU / Linux pentru majoritatea, deși Debian este disponibil pentru alte câteva nuclee ca bine. Deci, ' nu este surprinzător faptul că implementarea find pe aceste sisteme este GNU find.

Răspuns

Utilitățile GNU implementează adesea standardul POSIX și apoi îl extind și cu funcționalitate suplimentară pentru un plus de confort (și, ca parte inversă, scăderea portabilității între Unici). Aspectul portabilității este motivul pentru care veți vedea cândva răspunsuri sau comentarii pe acest site, care sunt foarte atenți să indicați când se presupune un utilitar GNU sau o altă implementare specifică a unui utilitar.

Dacă sunteți pe un Linux sistem, foarte probabil că veți utiliza implementarea GNU a find și probabil că nu ați avea un alt find instalat. Pe sistemele non-Linux, veți avea un find nativ și posibilitatea de a instala și GNU find (care cel mai adesea s-ar instala sub nume gfind sau, mai rar, gnufind).

La fel ca în majoritatea utilităților GNU, GNU find implementează și extinde specificația standard find . Prin urmare, nu este „mai simplu”, ci, în schimb, este mai complex, pentru a fi mai convenabil și ar fi oarecum mai ușor să faci anumite sarcini complexe cu acesta decât cu un standard find .

Implementări extinse ale find deseori, de exemplu, implementează -maxdepth și -mindepth predicate pe care standardul nu le menționează și, în special, GNU find are și -printf pentru a imprima numele de cale găsite folosind o varietate de posibilități de formatare (standardul find nu are -printf) și predicate pentru efectuarea potrivirii expresiilor regulate de diferite tipuri pe nume de cale, precum și o serie de alte predicate nestandardizate, dintre care unele se găsesc și în alte implementări ale find (posibil cu semantică atât de ușor diferită, cum ar fi -execdir whi ch funcționează ușor diferit în funcție de ceea ce find este utilizat 1 ).

-delete predicat, utilizat în răspunsul la care faceți legătura, este non-standard, dar implementat de GNU find, precum și în find pe alte sisteme non-Linux. GNU find „s -delete se va plânge dacă îl utilizați pentru a șterge un director care nu este gol, dar opțiunea corespunzătoare cu, de exemplu, OpenBSD” s find nu va (nici nu va șterge directorul care nu este gol).

Majoritatea sistemelor Linux, indiferent de distribuție, utilizează aceleași seturi de instrumente coreutils și findutils (variante precum busybox există, evident). Pentru a utiliza un set complet diferit de implementări de instrumente, va trebui să vă deplasați la unul dintre sistemele open source BSD sau la macOS, Solaris, AIX sau alt Unix comercial.


1 GNU find preîntâmpină ./ cu nume de cale atunci când se utilizează -execdir alte implementări nu fac „t.

Comentarii

  • Și -print0 și -direxec și -delete și … ;-). Opțiunile pentru separatorul nul disponibile în instrumentele GNU sunt deosebit de convenabile.
  • @StephenKitt Dar rar este necesar 🙂
  • corect, cu excepția cazului în care scrieți răspunsuri non-POSIX aici ;-). (Sau scripturi care trebuie să funcționeze oriunde .)
  • Principala problemă cu documentația GNU este că încearcă să permită oamenilor să utilizeze aliasuri non-standard la metodele POSIX și astfel să provoace scripturile aferente pentru a crea o blocare a furnizorului.
  • @StephenKitt -print0 este disponibil și pe * bsd și solaris; dar pe solaris xargs -0 nu funcționează ', deci gxargs -0 (din /usr/bin/sfw) ar trebui folosit în schimb.

Răspuns

La ce se referă adesea oamenii deoarece Linux este mai bine denumit GNU / Linux: Linux plus GNU. Prin urmare, instrumentele pe care le utilizați sunt probabil GNU.

  • Linux: un kernel, este utilizat în GNU / Linux, Android și multe alte sisteme.
  • GNU: un sistem de operare, adesea utilizat cu kernel-ul Linux, dar poate fi folosit și cu BSD, Hurd, Cygwin (un DLL pentru Windows-ul Microsoft, se pretinde a fi un kernel), WSL (Windows Subsystem for Linux: GNU without Linux, on Windows pentru Microsoft), HPUX, Solaris, Dec Athena și multe altele.

Prin urmare, probabil că utilizați GNU find.

GNU este un proiect pentru re- scrie, o versiune gratuită (gratuită ca în libertate, nu ca în preț) a Unixului, inclusiv instrumente precum find, proiectul GNU nu își face griji cu privire la conformitatea POSIX: se va conforma acolo unde are sens, dar va aduce și îmbunătățiri.

De asemenea, presupuneți că există doar un alt find este greșit.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *