Mi a teendő?
find /srv/cucc -name '*' ! -user root -type f
/srv/cucc/~$kumentum.docx
find /srv/cucc -name '*' ! -user root -type f -print0 | xargs -0 -I {} sh -c "chown root:csoport \"{}\"; chmod 0660 \"{}\""
chown: cannot access `/srv/cucc/~.docx': No such file or directory
Debug:
find /srv/cucc -name '*' ! -user root -type f -print0 | xargs -0 -I "{}" sh -c "echo \"{}\""
/srv/cucc/~.docx
Ezek szerint a xargs okozza a bajt, ugye? De hogy oldjam meg a problémát?
Köszönöm a segítséget.
- 5697 megtekintés
Hozzászólások
Troll: Elsőnek a code-tag lezárásával. Az ebből jövő flame-ket ezzel ki is szűröd, és mindenki a témára fog koncentrálni :-)
- A hozzászóláshoz be kell jelentkezni
Ha a mindenki részének érzed magad (nem vagy senki), akkor mostantól koncentrálj a témára :P
- A hozzászóláshoz be kell jelentkezni
a find -exec kapcsoloja nem felelne-e meg e celnak?
man find
- A hozzászóláshoz be kell jelentkezni
de lehet, csak nem megkerülni akarom a problémát, hanem megoldani.
- A hozzászóláshoz be kell jelentkezni
de létezik a file, és kézzel tudod chown-olni?
- A hozzászóláshoz be kell jelentkezni
A shell kibontja a
$kumentum
valtozodat, azert tunik el. Ne idezojelbe tedd a {}-t, hanem aposztrofok koze:
find /srv/cucc -name '*' ! -user root -type f -print0 | xargs -0 -I "{}" sh -c "chown root:csoport '{}'; chmod 0660 '{}'"
- A hozzászóláshoz be kell jelentkezni
Változó! És tényleg. Nagyon köszönöm. Értem, és tesztelem, hogy így minden jó-e (a felhasználóim igen-igen idétlen fájlneveket tudnak....). Ha nem jelzek vissza, akkor minden oké.
- A hozzászóláshoz be kell jelentkezni
Azért a lentebb ajánlott -exec kapcsoló mégis megfontolandó a jövőben, azzal ui. nem teszed ki magad ilyesminek.
- A hozzászóláshoz be kell jelentkezni
Ezt azert erdemes atgondoli. Mig ugyanis xargs-sal par exec() -cel (fajlmennyisegtol fuggo, de szerintem max olyan 3) meg lehet uszni a dolgot, addig -exec kapcsoloval annyi exec() ahany fajl. A xargs-os sok fajl eseteben gyorsabb lehet.
--
Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal
- A hozzászóláshoz be kell jelentkezni
Nem vetted eszre az xargs-nak atadott -I opciot,ami ha jol olvasom azt jelenti, hogy minden sorra meg fogja hivni az alkalmazasokat (chown/chmod jelen esetben) - azaz ugyanugy fajlonkent lesz 2 db exec.
- A hozzászóláshoz be kell jelentkezni
Tényleg.
És még meg is magyarázom a nemigazat...
$ find /tmp/x -name '00*' | xargs -I'{}' sh -c 'echo $$ {}' | wc -l
10000
$ find /tmp/x -name '00*' | xargs sh -c 'echo $$ ' | wc -l
9
- A hozzászóláshoz be kell jelentkezni
Kész voltam 100%-ig egyetérteni ennek tekintetében, aztán pár próba után kiderült, hogy AIX-on a find xargs nélkül sokkal gyorsabban végez egy 10000 tételes listával, mint xargs használatával.
De hogy ne legyen egyszerű, csak a natív find ilyen, mert ugyanez a megoldás a GNU findjával a leglassabb (ami azért meghökkentő, mert -exec nélküli keresésben viszont köröket ver a natívra - ezért tartom fenn).
Szóval bejött a most itt nem várt "it depends".
- A hozzászóláshoz be kell jelentkezni
mar latom van megoldas, de gondoltam adok en is egy alternativat, nem rosszabb, mint amit itt mondtak ;)
find /srv/cucc ! -user root -o ! -mode 0660 -type f | \
while read F; do
chown root:csoport "$F";
chmod 0660 "$F"
done
- A hozzászóláshoz be kell jelentkezni
De rosszabb. Ugyanis összekuszállja a soremelést tartalmazó filenév, míg az eredetiben nem véletlenül van -print0 - ugyanis az ettől jól kezeli.
Szerk. Azt örömmel látom, hogy az eredetiben tök fölöslegesen szereplő -name feltételt elhagytad (ez derék), de mi a francnak tetted oda azt a -mode -ot?
- A hozzászóláshoz be kell jelentkezni
Aki soremelest tartalmazo filenevet hasznal, megerdemli. :) Mas szoval nem tekintettem feltetelnek, hogy akar soremeles karaktert tartalmazo filenev is elofordulhat.
-mode: ha az user is jo es a mode is jo, akkor nincs mit tenni a fileval. Miert iteraljon ra egyet, ket exec()-cel?
Amugy meg, ha a mindenfele vegleteiben elcseszett filenev, es a teljesitmeny is lenyeges, akkor:
find /srv/cucc ! -user root -type f -print0 | xargs -r0 chown root:csoport
find /srv/cucc ! -mode 0660 -type f -print0 | xargs -r0 chmod 0660
- A hozzászóláshoz be kell jelentkezni
Remelem, sem rendszergazda nem vagy, mert akkor isten ovja a felhasznaloidat (mert te nem teszed), sem szoftverfejleszto nem vagy, mert isten ovja a szoftveredet felhasznalokat (mert te nem teszed).
Marmint ha az elso bekezdest komolyan irtad.
Amugy valtozatlanul nem ertem, hogy a te -mode 0660 -d mitol jo, hisz kihagyod a 600-as, a 640-es, es i. t. jogu fajlokat, holott ilyen feltetelekrol nem volt szo.
Ujabb javaslatod a 2-szeri futtatassal meg rossz, mert a ket find futtatas kozott valtozhatnak a dolgok.
- A hozzászóláshoz be kell jelentkezni