Tänk på några vanliga * nix-system (säg Debian, CentOS, Arch och Kali).
Jag har alltid använt find
; Jag kommer inte ihåg att använda GNU-sökning, men från ett exempel Jag har sett att jag antog att syntaxen för GNU-sökningen kan vara enklare (även om kanske tillåter färre operationer).
Jag har två frågor:
-
Är
find
standardverktyget ”hitta eller hantera” i vanliga system eller kommer system att levereras med bådafind
ochGNU find
? -
Var
GNU find
avsedd att vara enklare attfind
?
Kommentarer
Svar
GNU-verktyg implementerar ofta POSIX-standarden och utökar den också med extra funktionalitet för ökad bekvämlighet (och, som baksidan av det, minskade bärbarheten över enheter). Portabilitetsaspekten är anledningen till att du någon gång kommer att se svar eller kommentarer på den här webbplatsen som är mycket noga med att påpeka när ett GNU-verktyg eller någon annan specifik implementering av ett verktyg antas.
Om du är på en Linux skulle du mycket troligen använda GNU-implementeringen av find
, och du skulle förmodligen inte ha någon annan find
installerat. På icke-Linux-system skulle du ha en inbyggd find
och möjlighet att också installera GNU find
(som oftast skulle installeras under namn gfind
eller, mindre ofta, gnufind
).
Som med de flesta GNU-verktyg, GNU find
implementerar och utökar standardspecifikationen find
. Det är därför inte ”enklare” utan istället utan tvekan mer komplicerat för att vara bekvämare, och det skulle vara något lättare att göra vissa komplexa uppgifter med det än med en strikt standardkompatibel find
.
Utökade implementeringar av find
implementerar ofta till exempel -maxdepth
och -mindepth
predikat som standarden inte nämner, och i synnerhet GNU find
har också -printf
för att skriva ut de hittade sökvägarna med en mängd olika formateringsmöjligheter (standarden find
har inte -printf
) och förutsägelser för att göra regelbundna uttrycksmatchningar av olika slag på sökvägar, liksom ett antal andra icke-standardiserade predikat, varav några också finns i andra implementeringar av find
(möjligen med någonsin så lite annorlunda semantik, som -execdir
whi ch fungerar lite annorlunda beroende på vad find
används 1 ).
-delete
predikat, som används i svaret som du länkar till, är inte standard, men implementeras av GNU find
samt i find
på vissa andra icke-Linux-system. GNU find
”s -delete
kommer att klaga om du använder den för att radera en icke-tom katalog, men motsvarande alternativ med t.ex. OpenBSD” s find
kommer inte (inte heller tar bort den icke-tomma katalogen).
De flesta Linux-system, oavsett distribution, använder samma coreutils och findutils toolset (varianter som upptagenbox finns, uppenbarligen). För att använda en helt annan uppsättning verktygsimplementeringar måste du flytta till ett av BSD-system med öppen källkod eller till macOS, Solaris, AIX eller någon annan kommersiell Unix.
1 GNU find
förlägger ./
till söknamn när du använder -execdir
medan några andra implementeringar gör inte det.
Kommentarer
- Och
-print0
och-direxec
och-delete
, och … ;-). Nollavgränsningsalternativen som finns i GNU-verktyg är särskilt praktiska. - @StephenKitt Men sällan behövs 🙂
- rätt, förutom när man skriver icke-POSIX-svar här ;-). (Eller skript som behöver fungera var som helst .)
- Huvudproblemet med GNU-dokumentationen är att det försöker låta människor använda icke-standardalias till POSIX-metoder och därmed orsaka relaterade skript för att skapa ett leverantörslås.
- @StephenKitt
-print0
finns också på * bsd och solaris; men på solarisxargs -0
fungerar inte ' så attgxargs -0
(från/usr/bin/sfw
) bör användas istället.
Svar
Vad folk ofta hänvisar till eftersom Linux kallas bättre GNU / Linux: Linux plus GNU. Därför är de verktyg du använder förmodligen GNU.
- Linux: en kärna, den används i GNU / Linux, Android och många andra system.
- GNU: an operativsystem, som ofta används med Linux-kärnan, men kan också användas med BSD, Hurd, Cygwin (en DLL för Microsofts Windows, det låtsas vara en kärna), WSL (Windows Subsystem för Linux: GNU utan Linux, på Microsofts Windows), HPUX, Solaris, Dec Athena och många andra.
Därför använder du förmodligen GNU-sökning.
GNU är ett projekt för att skriv, en Gratis (gratis som i frihet, inte som i pris) version av hela Unix, inklusive verktyg som find
, GNU-projektet oroar sig inte för POSIX-efterlevnad: Det kommer att följa där det är vettigt, men kommer också att göra förbättringar.
Du antar också att det bara finns en annan find
är fel.
find
på upptagenbox eller android 😉 På icke-Linux-system heter GNU find vanligtvisgfind
.find --version
😉find
implementeringen på dessa system är GNUfind
.