Overvej nogle almindelige * nix-systemer (siger Debian, CentOS, Arch og Kali).
Jeg har altid brugt find
; Jeg kan ikke huske at bruge GNU find, men fra et eksempel Jeg har set, antog, at syntaksen for GNU find kunne være enklere (skønt muligvis tillader færre handlinger).
Jeg har to spørgsmål:
-
Er
find
standardværdien “find or-and manage” i almindelige systemer, eller vil systemer komme med beggefind
ogGNU find
? -
Var
GNU find
beregnet til at være enklere atfind
?
Kommentarer
Svar
GNU-værktøjer implementerer ofte POSIX-standarden og udvider den også med ekstra funktionalitet for ekstra bekvemmelighed (og som bagsiden af det, nedsat bærbarhed på tværs af enheder). Bærbarhedsaspektet er, hvorfor du engang vil se svar eller kommentarer på dette websted, der er meget omhyggelige med at påpege, når der antages et GNU-værktøj eller en anden specifik implementering af et hjælpeprogram.
Hvis du er på en Linux system, ville du meget sandsynligvis bruge GNU-implementeringen af find
, og du ville sandsynligvis ikke have en anden find
installeret. På ikke-Linux-systemer ville du have en indfødt find
og muligheden for også at installere GNU find
(som oftest installeres under navn gfind
eller mindre ofte gnufind
).
Som med de fleste GNU-værktøjer, GNU find
implementerer og udvider standard find
specifikation . Det er derfor ikke “enklere” men i stedet uden tvivl mere komplekst for at være mere praktisk, og det ville være noget lettere at udføre visse komplekse opgaver med det end med en strengt standardkompatibel find
.
Udvidede implementeringer af find
ofte f.eks. implementerer -maxdepth
og -mindepth
forudsigelser, som standarden ikke nævner, og især GNU find
har også -printf
til at udskrive de fundne vejnavne ved hjælp af en række formateringsmuligheder (standarden find
har ikke -printf
), og forudsigelser til at foretage regelmæssig ekspressionstilpasning af forskellige slags på stienavne samt et antal andre ikke-standardprædikater, hvoraf nogle også findes i andre implementeringer af find
(muligvis med nogensinde så lidt forskellige semantik, som -execdir
whi ch fungerer lidt anderledes afhængigt af hvad find
bruges 1 ).
-delete
predikat, brugt i svaret, som du linker til, er ikke-standard, men implementeret af GNU find
såvel som i find
på nogle andre ikke-Linux-systemer. GNU find
“s -delete
klager, hvis du bruger den til at slette en ikke-tom mappe, men den tilsvarende mulighed med f.eks. OpenBSD” s find
vil ikke (hverken slette den ikke-tomme mappe).
De fleste Linux-systemer, uanset distribution, bruger de samme kerneværktøjer og findutils værktøjssæt (varianter som busybox eksisterer naturligvis). Hvis du vil bruge et helt andet sæt værktøjsimplementeringer, skal du flytte til et af open source BSD-systemer eller til macOS, Solaris, AIX eller en anden kommerciel Unix.
1 GNU find
forudser ./
til stienavne, når du bruger -execdir
mens nogle andre implementeringer gør ikke det.
Kommentarer
- Og
-print0
og-direxec
, og-delete
, og … ;-). De null-separatorindstillinger, der er tilgængelige i GNU-værktøjer, er særligt praktiske. - @StephenKitt Men sjældent nødvendigt 🙂
- rigtigt, undtagen når man skriver ikke-POSIX-svar her ;-). (Eller scripts, der skal arbejde hvor som helst .)
- Hovedproblemet med GNU-dokumentationen er, at det forsøger at lade folk bruge ikke-standardaliaser til POSIX-metoder og dermed forårsage relaterede scripts til oprettelse af en leverandørlås.
- @StephenKitt
-print0
er også tilgængelig på * bsd og solaris; men på solaris fungererxargs -0
ikke ' t, sågxargs -0
(fra/usr/bin/sfw
) skal bruges i stedet.
Svar
Hvad folk ofte henviser til da Linux betegnes bedre som GNU / Linux: Linux plus GNU. Derfor er de værktøjer, du bruger, sandsynligvis GNU.
- Linux: en kerne, den bruges i GNU / Linux, Android og mange andre systemer.
- GNU: en operativsystem, ofte brugt med Linux-kernen, men kan også bruges med BSD, Hurd, Cygwin (en DLL til Microsofts Windows, det foregiver at være en kerne), WSL (Windows Subsystem til Linux: GNU uden Linux, på Microsofts Windows), HPUX, Solaris, Dec Athena og mange andre.
Derfor bruger du sandsynligvis GNU find.
GNU er et projekt at gentage skriv, en Gratis (gratis som i frihed, ikke som i pris) version af hele Unix, inklusive værktøjer såsom find
, GNU-projektet bekymrer sig ikke om POSIX-overholdelse: Det vil overholde, hvor det giver mening, men vil også foretage forbedringer.
Du antager også, at der kun er en anden find
er forkert.
find
på busybox eller android 😉 På ikke-linux-systemer kaldes GNU find normaltgfind
.find --version
😉find
implementeringen på disse systemer er GNUfind
.