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
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
jacsh
, 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.
-name "*"
vastaa kaikkia nimiä, joten se ' ei ole toimintatesti, joka voidaan poistaa. Sekächmod
ettächgrp
: lla on-R
-vaihtoehto rekursiiviselle toiminnalle.