Jag vill veta innebörden av {} +
i exec
kommando, och vad är skillnaden mellan {} +
och {} \;
. För att vara exakt, vad är skillnaden mellan dessa två:
find . -type f -exec chmod 775 {} + find . -type f -exec chmod 775 {} \;
Kommentarer
- Det beskrivs i
man find(1)
mycket detaljerat, lätt att hitta av någon. Var inte ' t lat. - Tack kära Miroslav, jag sökte i
man exec
! - Ah, jag hade aldrig stött på
{} +
-användningen förut. Jag använder normalt xargs för det (och oftafind ... -print0 | xargs -0 ...
)
Svar
Att använda ;
(semikolon) eller +
(plustecken) är obligatoriskt för att avsluta skalkommandona som anropas av -exec
/ execdir
.
Skillnaden mellan ;
(semikolon) eller +
(plustecken) är hur argumenten skickas till hitta ”s -exec
/ -execdir
parameter. Till exempel:
-
med
;
körs flera kommandon (separat för varje argument),Exempel:
$ find /etc/rc* -exec echo Arg: {} ";" Arg: /etc/rc.common Arg: /etc/rc.common~previous Arg: /etc/rc.local Arg: /etc/rc.netboot
Alla följande argument till
find
anses vara argument till kommandot.Strängen
{}
ersätts med det aktuella filnamnet bearbetas. -
med
+
kommer att utföra minst möjliga kommandon (eftersom argumenten kombineras tillsammans). Det är mycket likt hurxargs
-kommandot fungerar, så det kommer att använda så många argument per kommando som möjligt för att undvika att överskrida den maximala gränsen för argument per rad.Exempel:
$ find /etc/rc* -exec echo Arg: {} "+" Arg: /etc/rc.common /etc/rc.common~previous /etc/rc.local /etc/rc.netboot
Kommandoraden byggs genom att lägga till varje valt filnamn i slutet.
Endast en instans av
{}
är tillåten inom kommandot.
Se även:
-
man find
- Använda semikolon (;) vs plus (+) med exec i sökning vid SO
- Enkelt unix-kommando, vad är {} och \; för vid SO
Kommentarer
- Det finns en skillnad och en stor skillnad. Se user1116056 ' s svar
Svar
Med tanke på att kommandosökningen kommer under tre filer:
fileA fileB fileC
Om du använder -exec
med ett plus (+
) tecken,
find . -type f -exec chmod 775 {} +
det blir:
chmod 775 fileA fileB fileC
Kommandoraden byggs genom att lägga till varje matchat filnamn i slutet, vilket är på samma sätt som xargs
bygger sina kommandorader. Det totala antalet anrop av kommandot (chmod
, i detta fall) kommer att vara mycket mindre än antalet matchade filer.
Om du använder -exec
med semikolon (;
),
find . -type f -exec chmod 775 {} \;
det blir:
chmod 775 fileA chmod 775 fileB chmod 775 fileC
Svar
Enligt man find
:
-exec-kommando {} + Detta variant av -exec-åtgärden kör det angivna kommandot på de valda filerna, men kommandoraden byggs genom att lägga till varje valt filnamn i slutet; det totala antalet anrop av kommandot kommer att vara mycket mindre än antalet matchade filer. Kommandoraden är byggd på ungefär samma sätt som xargs bygger sina kommandorader. Endast en instans av ”{}” är tillåten i kommandot. Kommandot körs i startkatalogen.