Ik wil de betekenis weten van {} +
in de exec
commando, en wat is het verschil tussen {} +
en {} \;
. Om precies te zijn, wat is het verschil tussen deze twee:
find . -type f -exec chmod 775 {} + find . -type f -exec chmod 775 {} \;
Reacties
Answer
Het gebruik van ;
(puntkomma) of +
(plusteken) is verplicht om de shell-opdrachten te beëindigen die worden aangeroepen door -exec
/ execdir
.
Het verschil tussen ;
(puntkomma) of +
(plusteken) is hoe de argumenten worden doorgegeven aan find “s -exec
/ -execdir
parameter. Bijvoorbeeld:
-
door
;
te gebruiken, worden meerdere opdrachten uitgevoerd (afzonderlijk voor elk argument),Voorbeeld:
$ find /etc/rc* -exec echo Arg: {} ";" Arg: /etc/rc.common Arg: /etc/rc.common~previous Arg: /etc/rc.local Arg: /etc/rc.netboot
Alle volgende argumenten voor
find
worden beschouwd als argumenten voor het commando.De string
{}
wordt vervangen door de huidige bestandsnaam e wordt verwerkt. -
met
+
zal de minst mogelijke commandos uitvoeren (aangezien de argumenten samen worden gecombineerd). Het lijkt erg op hoe hetxargs
commando werkt, dus het zal zoveel mogelijk argumenten per commando gebruiken om te voorkomen dat het maximum aantal argumenten per regel wordt overschreden.Voorbeeld:
$ find /etc/rc* -exec echo Arg: {} "+" Arg: /etc/rc.common /etc/rc.common~previous /etc/rc.local /etc/rc.netboot
De opdrachtregel wordt opgebouwd door elke geselecteerde bestandsnaam aan het einde toe te voegen.
Slechts één instantie van
{}
is toegestaan binnen het commando.
Zie ook:
-
man find
- Puntkomma (;) vs plus (+) gebruiken met exec in find bij SO
- Eenvoudig unix-commando, wat zijn de {} en \; voor bij SO
Reacties
- Er is is een verschil en een belangrijk verschil. Zie user1116056 ' s antwoord
Antwoord
Gezien het feit dat de commando find krijgt onder drie bestanden:
fileA fileB fileC
Als je -exec
gebruikt met een plus (+
) teken,
find . -type f -exec chmod 775 {} +
het zal zijn:
chmod 775 fileA fileB fileC
De opdrachtregel wordt opgebouwd door elke overeenkomende bestandsnaam aan het einde toe te voegen, op dezelfde manier waarop xargs
de opdrachtregels bouwt. Het totale aantal aanroepen van het commando (chmod
, in dit geval) zal veel minder zijn dan het aantal overeenkomende bestanden.
Als u -exec
gebruikt met een puntkomma (;
),
find . -type f -exec chmod 775 {} \;
het zal zijn:
chmod 775 fileA chmod 775 fileB chmod 775 fileC
Antwoord
Volgens man find
:
-exec commando {} + Dit variant van de -exec-actie voert de opgegeven opdracht uit op de geselecteerde bestanden, maar de opdrachtregel wordt opgebouwd door elke geselecteerde bestandsnaam aan het einde toe te voegen; het totale aantal aanroepen van de opdracht zal veel minder zijn dan het aantal overeenkomende bestanden. De opdrachtregel is op vrijwel dezelfde manier gebouwd als xargs de opdrachtregels bouwt. Slechts één exemplaar van ‘{}’ is toegestaan binnen de opdracht. De opdracht wordt uitgevoerd in de startmap.
man find(1)
in detail, gemakkelijk te vinden door iedereen. Don ' wees niet lui.man exec
!{} +
nog nooit eerder tegengekomen. Ik gebruik daarvoor normaal xargs (en vaakfind ... -print0 | xargs -0 ...
)