Megértem, hogy a -exec
+
opciót vehet igénybe hogy utánozza a xargs
viselkedését. Van-e olyan helyzet, amikor egyik formát részesítené előnyben a másikkal szemben?
Én személy szerint inkább az első űrlapot részesítem előnyben, csak azért, hogy elkerüljem a pipa használatát. Biztos vagyok benne, hogy a elvégezte a megfelelő optimalizálást. Helyes vagyok?
Válasz
Érdemes láncolni a hívásokat, hogy megtalálja (egyszer, amikor megtudta, hogy lehetséges , ami ma lehet). Ez természetesen csak addig lehetséges, amíg a keresésben marad. Miután átadta az xargs-t, ez nem tartozik a hatókörbe.
Kis példa, két fájl a.lst és b.lst:
cat a.lst fuddel.sh fiddel.sh cat b.lst fuddel.sh
Itt nincs trükk – egyszerűen az a tény, hogy mindkettő tartalmazza a „fuddel” szót, de csak az egyik tartalmazza a „fiddel” szót.
Tegyük fel, hogy ezt nem tudtuk. Olyan fájlban keresünk, amely 2 feltételnek felel meg:
find -exec grep -q fuddel {} ";" -exec grep -q fiddel {} ";" -ls 192097 4 -rw-r--r-- 1 stefan stefan 20 Jun 27 17:05 ./a.lst
Nos, talán ismeri a grep vagy egy másik program szintaxisát, hogy mindkét karakterláncot feltételként adja át, de ez ” Nem ez a lényeg. Minden olyan program, amely igaz vagy hamis eredményt adhat, argumentumként egy fájlt megadva – a grep csak egy népszerű példa volt.
Megjegyzés: kövesse a következőt: find -exec más keresési parancsokkal, például -ls vagy -delete vagy valami hasonló. Megjegyzés: a törlés nemcsak az rm (fájlokat távolítja el), hanem az rmdir (eltávolítja a könyvtárakat) is.
Egy ilyen láncot a parancsok ÉS kombinációjaként olvashatunk, amennyiben másként nincs megadva (mégpedig egy -or
kapcsolóval (és parens (amelyekre szükség van maszkolásra))).
Tehát nem hagyja el a láncláncot, ami hasznos dolog. Nem látok semmilyen előnyt a -xargs használatában, mivel óvatosan kell eljárnia a fájlok átadásakor, amit a megtalálásnak nem kell tennie – ez automatikusan kezeli az egyes fájlok átadását egyetlen érvként az Ön számára.
Ha úgy gondolja, hogy szüksége van némi maszkolásra a {} zárójelekre , keresse fel bizalommal a kérdésemet. Állításom a következő: Nem.
Megjegyzések
Válasz
A fájlnevek biztonságos továbbítása a xargs
fájlba megköveteli, hogy a find
támogassa a -print0
opció, és a xargs
a megfelelő opcióval rendelkezik az olvasáshoz (--null
vagy -0
). Ellenkező esetben a fájlnevek unfintab paranccsal A névben szereplő karakterek, visszavágás, idézőjelek vagy szóköz szó váratlan viselkedést okozhatnak. Másrészt find -exec {} +
a POSIX find
specifikációban található , tehát hordozható, és kb. olyan biztonságos, mint a find -print0 | xargs -0
, és határozottan biztonságosabb, mint a find | xargs
. Azt javasoljuk, hogy soha ne csináljon find | xargs
-print0
nélkül.
Megjegyzések
- Figyelemre méltó kivétel a
find … -exec … {} +
hordozhatósága alól az OpenBSD, amely ezt a funkciót csak a 2012-ben kiadott 5.1-es verzióval szerezte meg. Minden BSD-vel rendelkeztek-print0
több évig, még az OpenBSD is (bár egy ideig ellenállt ennek a funkciónak is). A Solaris viszont ragaszkodik a POSIX funkcióihoz, így-exec +
és nincs-print0
. -
-print0
fájdalom, és bár érvelhetxargs --delimiter "\n"
nem ‘ t ekvivalens, én ‘ soha nem használtam előbbit, miután felfedeztem az utóbbit . - Nem látom ‘, hogy
-0
hogyan okoz több fájdalmat, mint--delimiter "\n"
. - A
-0
mellett a GNUxargs
-r
szükséges a parancs futtatásának elkerülése érdekében, ha ‘ nincs bemenet. - A
| xargs -r0 cmd
másik problémája, hogycmd
‘ s stdin érintett (axargs
megvalósítástól függően ez ‘ s/dev/null
vagy a csövet.
Válasz
Ha a -exec ... ;
űrlapot használja hogy elkerülje a pontosvesszőt), fájlnévenként egyszer futtatja a parancsot. Ha a -print0 | xargs -0
parancsot használja, fájlnévenként több parancsot is futtat. Feltétlenül használja a -exec +
űrlap, amely több fájlt helyez el egyetlen parancssorban, és sokkal gyorsabb, ha nagy számú fájlról van szó.
Nagy előnye a xargs
több parancs párhuzamos futtatásának lehetősége a xargs -P
használatával. Többmagos rendszereken ez óriási időmegtakarítást eredményezhet.
Megjegyzések
- Arra gondolt, hogy
-P
a-p
helyett. Ne feledje, hogy axargs -P
nem szerepel a POSIX szabványban, míg azfind -exec {} +
, ami fontos, ha hordozhatóságra törekszik. - @Alexios Nem szükséges, hogy ‘ ne kerülje el a pluszjelet, mert annak nincs külön jelentése a héj szempontjából:
find /tmp/ -exec ls "{}" +
remekül működik. - Természetesen korrigál. Én ‘ olyan sokáig megúsztam mindent a
-exec
után (I ‘ ma mazochista , Én még ‘ még idézőjeleket sem használok a{}
elkerüléséhez, mindig beírom a következőt:\{\}
; ne ‘ ne kérdezz), minden úgy néz ki, mintha most el kellene menekülni. - @Alexios: Ha találsz egy példát (kivéve, ha mazochista nem vagy), ahol a nadrágtartó maszkolása hasznos, kérjük, adja meg válaszként az itt feltett kérdésemre – afaik ez a tipp elavult, és csak reliktum a kézikönyvben. Én ‘ még soha nem láttam olyan példát, ahol
find /tmp/ -exec ls {} +
nem működne ‘. - Számomra ez a SunOS 4 napjaiban kialakult izommemória. Mivel ‘ évek óta csinálom, teljesen nem vettem észre, amikor
bash
szó szerint kezdte elfogadni a zárójeleket. Én ‘ biztos vagyok benne, hogy legalább az egyik régi héj, amelyet én ‘ használtam, hissy illeszkedést adott, ha a nadrágtartó elenyészett ‘ t megúszta.
Válasz
A teljesítmény tekintetében azt gondoltam, hogy -exec … +
egyszerűen jobb lenne, mert egyetlen eszköz minden munkát végez, de a GNU findutil dokumentációjának egy része ezt mondja -exec … +
bizonyos esetekben kevésbé hatékony lehet:
[keresés a ] kevésbé hatékony lehet, mint a
xargs
néhány használata; Például axargs
lehetővé teszi új parancssorok felépítését, miközben az előző parancs még fut, és lehetővé teszi számos párhuzamosan futó parancs megadását. Azfind ... -exec ... +
konstrukció előnye azonban a széles hordozhatóság. A GNU findutils a 4.2.12-es verzióig [2005. január] ig nem támogatta a ‘-exec ... +
’; ennek az egyik oka, hogy már minden esetben megvolt a ’-print0
’ akció.
Nem voltam egészen biztos abban, hogy ez mit jelent, ezért megkérdeztem a csevegésben, ahol derobert ezt úgy magyarázta:
find
valószínűleg folytathatja a következő fájlcsomag keresését, miközben a A-exec … +
fut, de nem “t.
find … | xargs …
igen, mert akkor a keresés más folyamat, és megtartja addig fut, amíg a csőpuffer meg nem telik
(Formázás általam.)
Tehát van ilyen. De ha a teljesítmény valóban számít, akkor reális összehasonlítást kell végeznie, vagy inkább meg kell kérdeznie magától, hogy egyáltalán szeretne-e shellt használni ilyen esetekre.
Itt ezen a webhelyen jobbnak látom azt tanácsolni az embereknek, hogy használja a -exec … +
űrlapot, amikor csak lehetséges, mert csak azért, mert egyszerűbb, és a többi válaszban említett okok miatt (pl. furcsa fájlnevek kezelése anélkül, hogy sokat kellene gondolkodnia).
-exec
módjaxargs -P4
úgy, hogy a négy mag közül három ne ‘ maradjon tétlen?