A find, a xargs és a csúf (=szerkesztés alatti Word-dokumentum)

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.

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 find -exec kapcsoloja nem felelne-e meg e celnak?

man find

de létezik a file, és kézzel tudod chown-olni?

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 '{}'"

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 

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".

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

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?

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

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.