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 ofta find ... -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 hur xargs -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:

Kommentarer

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.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *