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

  • Ez a bejegyzés megnyitotta a szemem a . Nagyon köszönöm!
  • ” Nem látok ‘ semmilyen előnyt a használatában -xargs “. Mi ‘ s a -exec módja xargs -P4 úgy, hogy a négy mag közül három ne ‘ maradjon tétlen?
  • @DamianYerrick: Az -exec parancsot ne fejezze be a “; “, de + (/ plusz előjellel).

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 érvelhet xargs --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 GNU xargs -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, hogy cmd ‘ s stdin érintett (a xargs 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 a xargs -P nem szerepel a POSIX szabványban, míg az find -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 a xargs 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. Az find ... -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).

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük