Overweeg enkele veelvoorkomende * nix-systemen (bijvoorbeeld Debian, CentOS, Arch en Kali).
Ik altijd gebruikt find
; Ik kan me niet herinneren dat ik GNU find heb gebruikt, maar uit een voorbeeld heb ik gezien dat ik aannam dat de syntaxis van GNU find eenvoudiger zou kunnen zijn (hoewel kan minder bewerkingen toestaan).
Ik heb twee vragen:
-
Is
find
het standaard “zoek-en-werk” -hulpprogramma in veelgebruikte systemen of worden systemen geleverd met beidefind
enGNU find
? -
Was
GNU find
bedoeld eenvoudiger te zijn naarfind
?
Reacties
Answer
GNU-hulpprogrammas implementeren vaak de POSIX-standaard en breiden deze vervolgens uit met extra functionaliteit voor extra gemak (en, als de keerzijde daarvan, verminderde draagbaarheid tussen Unices). Het portabiliteitsaspect is waarom je soms antwoorden of commentaren op deze site zult zien die heel voorzichtig zijn om aan te geven wanneer een GNU-hulpprogramma of een andere specifieke implementatie van een hulpprogramma wordt verondersteld.
Als je een Linux-computer gebruikt. systeem, zou u zeer waarschijnlijk de GNU-implementatie van find
gebruiken, en u zou waarschijnlijk geen andere find
geïnstalleerd. Op niet-Linux-systemen zou je een native find
hebben en de mogelijkheid om ook GNU find
te installeren (die meestal onder de name gfind
of, minder vaak, gnufind
).
Zoals met de meeste GNU-hulpprogrammas, GNU find
implementeert en breidt de standaard find
specificatie uit. Het is daarom niet “eenvoudiger” maar in plaats daarvan aantoonbaar complexer om handiger te zijn, en het zou iets gemakkelijker zijn om bepaalde complexe taken ermee uit te voeren dan met een strikt standaard compliant find
.
Uitgebreide implementaties van find
implementeren bijvoorbeeld vaak de -maxdepth
en -mindepth
predikaten die de standaard niet vermeldt, en GNU find
in het bijzonder heeft ook -printf
om de gevonden padnamen af te drukken met een verscheidenheid aan opmaakmogelijkheden (de standaard find
heeft geen -printf
), en predicaten voor het doen van verschillende soorten reguliere expressies voor padnamen, evenals een aantal andere niet-standaard predikaten, waarvan sommige ook worden gevonden in andere implementaties van find
(mogelijk met ooit zo iets andere semantiek, zoals -execdir
whi ch werkt enigszins anders, afhankelijk van wat find
wordt gebruikt 1 ).
De -delete
predikaat, gebruikt in het antwoord waarnaar u linkt, is niet standaard, maar geïmplementeerd door GNU find
evenals in het find
op sommige andere niet-Linux-systemen. GNU find
“s -delete
zal klagen als je het gebruikt om een niet-lege directory te verwijderen, maar de corresponderende optie met bijvoorbeeld OpenBSD” s find
zal niet (geen van beide zal de niet-lege map verwijderen).
De meeste Linux-systemen, ongeacht de distributie, gebruiken dezelfde coreutils en findutils toolset (varianten zoals busybox bestaat natuurlijk). Om een compleet andere set toolimplementaties te gebruiken, zou je moeten verhuizen naar een van de open source BSD-systemen of naar macOS, Solaris, AIX of een andere commerciële Unix.
1 GNU find
voegt ./
toe aan padnamen bij gebruik van -execdir
terwijl sommige andere implementaties “t.
Reacties
- En
-print0
, en-direxec
, en-delete
, en … 😉 De opties voor null-scheidingstekens die beschikbaar zijn in GNU-tools zijn bijzonder handig. - @StephenKitt Maar zelden nodig 🙂
- juist, behalve wanneer je hier niet-POSIX-antwoorden schrijft ;-). (Of scripts die overal moeten werken.)
- Het grootste probleem met de GNU-documentatie is dat het mensen probeert niet-standaard aliassen voor POSIX-methoden te laten gebruiken en zo de gerelateerde scripts om een vendor lock in te creëren.
- @StephenKitt
-print0
is ook beschikbaar op * bsd en solaris; maar op solarisxargs -0
werkt ' niet, dusgxargs -0
(van/usr/bin/sfw
) moet in plaats daarvan worden gebruikt.
Antwoord
Waar mensen vaak naar verwijzen omdat Linux beter GNU / Linux wordt genoemd: Linux plus GNU. Daarom zijn de tools die je gebruikt waarschijnlijk GNU.
- Linux: een kernel, deze wordt gebruikt in GNU / Linux, Android en vele andere systemen.
- GNU: een besturingssysteem, vaak gebruikt met de Linux-kernel, maar kan ook worden gebruikt met BSD, Hurd, Cygwin (een DLL voor Microsoft Windows, het doet zich voor als een kernel), WSL (Windows Subsystem voor Linux: GNU zonder Linux, op Microsoft Windows), HPUX, Solaris, Dec Athena en vele anderen.
Daarom gebruikt u waarschijnlijk GNU find.
GNU is een project om opnieuw write, een Gratis (gratis zoals in vrijheid, niet zoals in prijs) versie van heel Unix, inclusief tools zoals find
, het GNU-project maakt zich geen zorgen over POSIX-conformiteit: het zal voldoen waar het zinvol is, maar het zal ook verbeteringen aanbrengen.
Je neemt ook aan dat er maar één andere find
is verkeerd.
find
op busybox of android 😉 Op niet-linux-systemen wordt GNU-zoekopdracht meestalgfind
.find --version
😉find
implementatie op die systemen GNUfind
is.