Használható-e 2 parancs a -exec find parancs?

Próbáltam ilyet:

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

és kapok:

find: hiányzó argumentum az -exec-hez
chmod: nem fér hozzá {}: Nincs ilyen fájl vagy könyvtár
chmod: nem fér hozzá;: nincs ilyen fájl vagy könyvtár

Megjegyzések

  • Ne feledje, hogy a -name "*" minden névnek megfelel, tehát ' nem eltávolítható teszt. Ezenkívül mind a chmod, mind a chgrp -R opcióval rendelkezik a rekurzív műveletekhez.

Válasz

Ami a find parancsot illeti, további -exec parancsokat is hozzáadhat egymás után:

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

Ne feledje, hogy ez a parancs a resuljában van t, a (z)

chgrp -v new_group fájl & & chmod -v 770 fájl

az egyes fájlokon.

Az összes find “paraméter, például -name, -exec, -size és így tovább, valójában tesztek : find továbbra is egyesével futtatja őket, amíg az egész eddigi lánc true -nak értékelte. Tehát minden egyes egymást követő -exec parancs csak akkor kerül végrehajtásra, ha az előzőek true (azaz a parancsok 0 kilépési állapota). De a find megérti azokat a logikai operátorokat is, mint a vagy (-o) és a nem (!). Ezért a -exec tesztláncok használatához tesztet végeznek, függetlenül az előző eredmények , ilyesmit kellene használni:

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

Megjegyzések

  • +1: Igen, ez ' ennek legelegánsabb módja. Ha meg tudja magyarázni, miért használja a '{}' -t (a zárójelek körüli aposztrófok), kérjük, látogasson el ide: unix.stackexchange.com/q/ 8647/4485
  • @user Sajnos nem tudom ', hogy szükséges-e még. Éppen most elvégeztem egy tesztet, és még nem találkoztam olyan helyzettel, ahol ez bármit megváltoztatna. ' Azt hiszem, ' csak " jó gyakorlat ", amely kihal.
  • Az idézőjelek fontosak azoknál a fájloknál, amelyek nevében szóköz van.
  • @ naught101 Nem, az idézőjelekre szükség lehet néhány nem szabványos héjban, például fish és csh, de POSIX-szerű héjakban biztosan nincs rájuk szükség (sh, dash, bash, zsh, ksh, yash).

Válasz

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

Megjegyzések

  • @Gilles: A -c ' furcsa kezelés csodái 0 dollár, arra gondolok, hogy ez helytelen, valahányszor ránézek, de határozottan helyes.
  • Szeretem, ha az explicit héjat definiálnák …
  • Ez a válasz (és Giles div id = “73d9a33f1b”>

s an swer) úgy tűnik, hogy a sh -c kérdésre adott jobb válasz.

Válasz

A parancsot a héj először két parancsra elemzi, amelyeket egy ; választ el, amely egyenértékű egy új vonallal:

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

Ha shell parancsot akar futtatni, hívjon meg egy shellt kifejezetten a következővel: bash -c (vagy sh -c, ha nem érdekli, hogy a shell kifejezetten bash):

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

Vegye figyelembe a {} használatát érvelés a héjhoz; ez a zeroth argumentum (ami általában a shell vagy a szkript neve, de ez itt nem számít), ezért "$0".

Egyszerre több fájlnevet is átadhat a héjnak, és a héjat iterálhatja rajtuk, ez “gyorsabb lesz. Itt adom át a _ -t, mivel a szkript neve és a következő argumentumok fájlnevek, amelyek for x (a for x in "$@" parancsikon) ismétlődnek.

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

Ne feledje, hogy mivel a bash 4, vagy a zsh formátumban nem szükséges itt megtalálni. A bash futtassa a következőt: shopt -s globstar (tedd a ~/.bashrc helyre), hogy aktiváld a **/ rekurzív címtárgömböt. (zsh-ben ez folyamatosan aktív.) Ezután

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

vagy ha azt szeretné, hogy a fájlok sorrendben legyenek iterálva

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

Az egyik különbség a find paranccsal az, hogy a shell figyelmen kívül hagyja a dot fájlokat (azokat a fájlokat, amelyek neve . ). A bash-ba történő felvételükhöz először állítsd be az GLOBIGNORE=.:.. -t; zsh-ben pedig a **/*(D) -t használd globális mintaként.

Megjegyzések

  • Ez a válasz (és Glenn ' válasza) úgy tűnik a jobb válasz a kérdésre, ha a sh -c.
  • chgrp és chmod egyaránt rendelkezik

    opció a rekurzív műveletekhez.

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