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
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
éscsh
, 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
éschmod
egyaránt rendelkezikopció a rekurzív műveletekhez.
-name "*"
minden névnek megfelel, tehát ' nem eltávolítható teszt. Ezenkívül mind achmod
, mind achgrp
-R
opcióval rendelkezik a rekurzív műveletekhez.