Onko mahdollista käyttää kahta komentoa -exec -osiossa find -komento?

Olen kokeillut jotain:

find . -name "*" -exec chgrp -v new_group {} ; chmod -v 770 {} \; 

ja saan:

find: puuttuva argumentti -execiin
chmod: ei pääse {}: Ei sellaista tiedostoa tai hakemistoa
chmod: ei voi käyttää;: Ei tällaista tiedostoa tai hakemistoa

Kommentit

  • Huomaa, että -name "*" vastaa kaikkia nimiä, joten se ' ei ole toimintatesti, joka voidaan poistaa. Sekä chmod että chgrp: lla on -R -vaihtoehto rekursiiviselle toiminnalle.

Vastaa

Mitä tulee komentoon find, voit myös lisätä vain -exec -komentoja riviin:

find . -name "*" -exec chgrp -v new_group "{}" \; -exec chmod -v 770 "{}" \; 

Huomaa, että tämä komento on sen resulissa t, vastaava käytettäessä

chgrp -v new_group-tiedosto & & chmod -v 770-tiedosto

jokaisessa tiedostossa.

Kaikki find ”-parametrit, kuten -name, -exec, -size ja niin edelleen, ovat itse asiassa testejä : find jatkaa niiden suorittamista yksitellen niin kauan kuin koko ketju on tähän mennessä arvioinut arvon true . Joten jokainen peräkkäinen -exec -komento suoritetaan vain, jos edelliset palauttivat true (ts. 0 komentojen poistumistila). Mutta find ymmärtää myös logiikkaoperaattorit, kuten tai (-o) ja ei (!). Siksi käyttää -exec -testiketjua riippumatta edellisten tulosten -kohdista, sinun pitäisi käyttää jotain tällaista:

find . -name "*" \( -exec chgrp -v new_group {} \; -o -true \) -exec chmod -v 770 {} \; 

Kommentit

  • +1: Kyllä, se ' on tyylikkäin tapa tehdä se. Jos pystyt selittämään, miksi käytät '{}' -merkkiä (heittoja aaltosulkeiden ympärillä), käy osoitteessa: unix.stackexchange.com/q/ 8647/4485
  • @user Valitettavasti en tiedä ' en, onko se edelleen tarpeen. Tein juuri testin juuri nyt, enkä ole ' törmännyt tilanteeseen, jossa se muuttaisi mitään. Kai se ' vain " hyvä käytäntö " kuolee.
  • Lainaukset ovat tärkeitä tiedostoille, joiden nimissä on välilyöntejä.
  • @ naught101 Ei, lainausmerkkejä saatetaan tarvita joissakin epätyypillisissä kuorissa, kuten fish ja csh, mutta niitä ei todellakaan tarvita POSIX-tyyppisissä kuoreissa (sh, dash, bash, zsh, ksh, yash).

Vastaa

find . -name "*" -exec sh -c "chgrp -v new_group "$0" ; chmod -v 770 "$0"" {} \; 

Kommentit

  • @Gilles: -c ' oudon käsittelyn ihmeet 0 dollaria saa minut ajattelemaan, että tämä on väärin joka kerta kun katson sitä, mutta se on ehdottomasti oikea.
  • Pidän nimenomaisen kuoren määrittelemisestä … div id = ”73d9a33f1b”>

s an swer) näyttää olevan parempi vastaus kysymykseen, kun otetaan huomioon sh -c.

Vastaus

Kuori jäsentää ensin komennon kahteen komentoon, jotka erotetaan toisistaan ;, joka vastaa uutta riviä:

find . -name "*" -exec chgrp -v new_group {} chmod -v 770 {} \; 

Jos haluat suorittaa komentokäskyn, kutsu komentotulkki nimenomaisesti bash -c (tai sh -c jos et välitä siitä, että kuori on nimenomaan bash):

find . -name "*" -exec sh -c "chgrp -v new_group "$0"; chmod -v 770 "$0"" {} \; 

Huomaa, että {} on argumentti kuorelle; se on nolla-argumentti (joka normaalisti on komentotulkin tai komentosarjan nimi, mutta tällä ei ole väliä tässä), joten siihen viitataan nimellä "$0".

Voit välittää useita tiedostojen nimiä kuorelle kerrallaan ja saada kuori toistumaan niiden läpi, se ”on nopeampi. Täällä välitän _ komentosarjan nimellä ja seuraavat argumentit ovat: tiedostonimet, jotka for x (pikakuvake for x in "$@") toistetaan.

find . -name "*" -exec sh -c "for x; do chgrp -v new_group "$x"; chmod -v 770 "$x"; done" _ {} + 

Huomaa, että koska bash 4 tai zsh, et tarvitse lainkaan täältä. Suorita bashissa shopt -s globstar (laita se ~/.bashrc -kansioon) aktivoidaksesi **/ rekursiivisen hakemistopallon. (zsh: ssä tämä on aktiivinen koko ajan.) Sitten

chgrp -v new_group -- **/*; chmod -v 770 -- **/* 

tai jos haluat, että tiedostot toistetaan järjestyksessä

for x in **/*; do chgrp -v new_group -- "$x" chmod -v 770 -- "$x" done 

Yksi ero komentoon find on, että komentotulkki jättää piste-tiedostot (tiedostot, joiden nimi alkaa . Jos haluat sisällyttää ne bashiin, aseta ensin GLOBIGNORE=.:..; zsh: ssä käytä **/*(D) globaalikuviona.

Kommentit

  • Tämä vastaus (ja Glenn ' s vastaus) näyttää olevan parempi vastaus kysymykseen, kun otetaan huomioon sh -c.
  • Sekä chgrp että chmod on -R vaihtoehto rekursiiviselle toiminnalle.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *