Kezdőlap › Fórumok › Vegyes felvágott › chmod -x * -R kivéve könyvtár
- This topic has 17 hozzászólás, 4 résztvevő, and was last updated 19 years, 3 months telt el by
uzsolt.
-
SzerzőBejegyzés
-
2006-09-02-09:34 #2070587Balage_82 wrote:Megengedhető hosszúság ???
Szerinted a bash parancssora végtelen hosszú sorokat elbír? Tudod, azért nem árt tárolni memóriában, esetleg swapon, hogy fel tudja dolgozni. Legjobb tudomásom szerint a mem és a swap is véges a legtöbb rendszeren. Általában 32768 karakter szokott lenni (legalábbis eddigi rendszereimen ennyi volt).
Szerk.: vagy ez nem pont így működik? A
Code:for i in `seq 1 100000`; do echo $i ; donegond nélkül lefutott ???
2006-09-02-09:39 #2070588Na jó de a leghoszab könyvtár/fájlnevem sem hosszab 20 karakternél. Vagy a for ciklus egymás után fűzné az összeset?
Egyszerre csak egy könyvtárral foglalkozik, szépen végigmegy a fájlokon, aztán következő könyvtár… repeat until 🙂Ha arra gondolsz, hogy hány sort írhat ki terminálra az a buffermérettel állítható. Bár a script csak annyit, ír ki, hogy sikerült/nem sikerült. És emlékeim szerint kb 200 soronként törli a buffert.
2006-09-02-09:52 #2070589Balage_82 wrote:Ha arra gondolsz, hogy hány sort írhat ki terminálraNem. Hanem arra, hogy a bash „kezébe” milyen hosszú sztring kerül, az nem lehet végtelen hosszú, mivel azt valahogy tárolni kell valamilyen változóban. Tehát a számítógépen se tudsz tetszőlegesen pontos (tizedesjegyek száma) számokkal számolni, mert azt is tárolni kell. Akármilyen kis memóriát foglal egy tizedesjegy, qrva sokszor qrva kicsi lehet qrva nagy, és előbb-utóbb eléred a tárolókapacitás végét. Itt is, valahogy fel kell dolgoznia a bash-nak, tehát a zárójelezés, idézőjel, Alt+7 karakterek, stb. helyére be kell írni a megfelelő dolgokat. Ahhoz, hogy ezt meg tudd tenni, kezelned kell valamilyen módon, ami memóriát igényel.
És persze gondolom, nem a memória mérete miatt van ez harmincezres korlát (nehogy már egy parancs miatt fagyasszuk a gépet…), tehát több memmel rendelkező gépen nem lesz nagyobb ez a szám. És ezt, ha mondjuk minden fájlneved 10 karakter, akkor kb. 3000 fájl a korlát (persze nem számítottuk, hogy a find elérési utat is ad, ha kell, szóval akár néhány százra is lecsökkenhet, ami akár gyakori méret is lehet).
2006-09-02-10:25 #2070590Kezdem elveszteni a fonalat… 🙂
Code:for filename in `find „$1” -type f -print | sed ‘s/ /===/g’`;do
filename=`echo $filename | sed ‘s/===/ /g’`
chmod 644 „$filename” 2>/dev/null1. a find csak fájl nevekkel tér vissza, részleges elérési útvonallal révén paraméterként megadod induláskor hogy mely könyvtárra alkalmazza (leggyakrabban .), amelyben a sed lecseréli a szóközöket (olyan karakterre ami tuti nincs fájlnévben)
2. filename változóban eltárolja a fájl útvonalat, amibe visszacseréljük a szóközöket
3. chmod megkapja paraméterként a változó értékét
4. ugyanezt ismétli könyvtárra isHa jól értem amire gondolsz, akkor lehetne gond, ha teljes elérési útvonallal dolgozna, és ráadásul piszoksok alkönyvtáram lenne, mert akkor tényleg az átadot elérési útvonal nagyon hosszú lenne.
2006-09-02-11:32 #2070591Még mindig nem. Szerinted hogy működik konkrétan a for? Mármint ebben az esetben?
Lefut a find (ami igenis beadja az elérési útvonalat, csak add ki, de ez tökmindegy), az Alt+7-es karakterek (`, nemtom, mi a neve) miatt. Ezután az Alt+7-ek közé kerül a find kimenete (persze az Alt+7-ek eltűnnek). Ezután a for azt csinálja, hogy az in és a do közötti részen végigmegy egyesével (szóköz, TAB, újsor meg lehet, hogy még néhány karakter a „mezőelválasztó”) és a do és a done közötti részt végrehajtja (persze a ciklusváltozónak mindig megadja a megfelelő értéket). Ha nem hiszed, akkor próbáld ki:Code:for i in alma körte szilva; do echo $i; doneTehát a find stdout-os kimenete (sed-del megbolondítva, de ez nem számít) lesz most az alma körte szilva. Namost ha az alma körte szilva túl hosszú (mondjuk a bash csak legfeljebb 10 karakter hosszú parancsokat bír kezelni), akkor van a baj, hiszen a bash-nak kell az egészet feldolgoznia (olyan „külső” parancs, hogy for, nincs, tehát maga a bash kezeli), és ha több az alma körte szilva és a parancs többi része, mint egy megadott karakterszám (mondjuk a 10), akkor nem az történik, aminek történnie kellene.
Amúgy világos, hogy működik a szkripted (legalábbis a részlet, amit közöltél), nem kell elmagyarázni 😉
2006-09-02-14:12 #2070592„Azért nem teljesen hiábavaló a szkript, hiszen a számok átírásával lehetővé válik az, hogy a fájlok és a könyvtárak jogait különbözőre beállítani rekurzívan.
Még csak kötözködésképpen: a for ciklus nem egész jó erre, mert mi van, ha qrva sok fájl/könyvtár van, és túllépi a megengedhető hosszúságot? Ezért lehetne mondjuk xargs-ot használni… És ekkor lehet, hogy a szóközök kezelése se kellene a sed-del.”
Megind csak olvasni kell…. man find;find konyvtar -type d/f -exec chmod parameterek {} ;
konyvtar – ‘.’ helyi, vagy más
d/f – d könyvtár, f file
paraméterek – chmod paraméterei
{} – itt adja meg a find a saját kimenetétEz a legtökéletesebb megoldás (mert a find egyszer hajtódik végre, külső file-t stb. nem használ), kiv., ha maga a „find” tartalmazná a chmod binárist…
2006-09-02-14:51 #2070593Ott a pont! Igaz, annyira nem sűrűn használom a find-ot erre a célra, általában jók szoktak lenni a jogaim. De most tényleg beugrott, hogy van ilyen lehetőség, sőt az xargs manual hivatkozik a find-ra is…
2009-12-04-19:58 #1884111Helló!
A fent említett dologra volnék kíváncsi. Értsd: Szeretném a fileokat futtathatatlanná tenni ade a könyvtárakban a navigációt is biztosítani kellene. Hogyan lehetene ezt?
-
SzerzőBejegyzés
- Be kell jelentkezni a hozzászóláshoz.

legutóbbi hsz