Könyvtár létrehozása fájlból [Megoldva]

Sziasztok!
Próbáltam megoldást keresni, vagy 3 órán keresztül, manuálisan már lehet már megcsináltam volna.
Van egy szövegfájl, benne minden sorban egy könyvtárnévvel. Ebből szeretnék az "adat" helyen egy-egy könyvtárat létrehozni.
Hogy lehetne ezt legegyszerűbben megcsinálni?
Perl alatt akartam megcsinálni, de tömbhöz az elejére " jel, végére " jel kéne, meg lecsípni a sorvégét, sed-el nem tudtam megcsinálni(olvastam ám keményen a doksit).
Valami egyszerűbb megoldás?

Hozzászólások

Vagy ha kódban szeretnéd később használni, vagy csak szereted bonyolítani:


#!/usr/bin/env python
import os
f=open("nevek.txt","r")
lines=f.readlines()
f.close()
for j in range(len(lines)):
    os.mkdir(lines[j].rstrip())

--
Keep it simple, stupid.

Ne mondd, nyizsa megoldasa _sem_ mukodik sok file nevre, meg a tied _sem_, viszont igy megy:


xargs -l mkdir <nevek

Ajanlom figyelmedbe az xargs '-t' kapcsolojanak hasznalat, pl.:


xargs -t mkdir <nevek
xargs -t -l mkdir <nevek

Szerk: bocs, most latom hogy a '-l' helyett a POSIX miatt a '-L1' perspektivikusabb

Elárulnád, hogy mi az elvi (vagy gyakorlati) probléma az xargs mkdir párossal? Nem sikerült rájönnöm. (Arra már rájöttem, hogy a lentebb emlegetett mkdir -p kell, de hogy mi a gáz, arra még nem. És szeretnék tanulni. Sem azt nem értem, hogy miért kell a -t, sem a -L1 opció szükségessége nem világos.)

Probald ki, nem fog fajni. A 'man xargs' olvasasa is segit.
Magyarul:
alapesetben az xargs az mkdir utan konkatenalja a directory-kat: 'mkdir a b c'
'-l'-el (-L1) egyenkent hajtja vegre: 'mkdir a', 'mkdir b', 'mkdir c'
a '-t' pedig a "trace", evvel mindezt latod is.
A problema pedig az hogy egysoros parancsnal (mkdir a b c) a shell parancs sor hossza korlatos,
ha tulleped sok directory nevvel a vege lemarad.

Köszönöm a választ. Kár, hogy értékelhető információ nincsen benne. Az xargs működésének lényege ugyanis - ahogy írtad is - az lenne, hogy összefűzi a bemenetét, és csinál belőle szép hosszú parancsot. Eddig teljesen jól oldottad meg az olvasás házi feladatot. Csak itt valahogy elvesztetted a fonalat, ugyanis az xargs léte pont azért szükséges, mert ő (gy.k.: xargs) velünk ellentétben tudja, hogy mekkora a megengedett leghosszabb parancs "sorhossza", és még mielőtt elérné azt, lefuttatja az addig előállt parancsot, majd elkezd felépíteni egy másikat, újabb párszáz paraméterrel. És ezt addig csinálja, amíg van mivel. Ha nem ez lenne a fontos az xargs -ban, akkor tök értelmetlen lenne használni.
Azaz:


xargs mkdir < file

és


mkdir `cat file`

között pontosan az az érdemi különbség, hogy az elsőnél nem szabad "arg list too long" hibaüzenetet kapnod semekkora bemenő fájl esetén (cserébe esetleg pár 10-100 db mkdir fut le), míg a második egy bizonyos méret felett mindig bukik (igaz, 1 db mkdir-t akar csak futtatni - ami persze olcsó lenne). Persze ha beteszed azt a nyomorult -L1 opciót az xargs mögé az mkdir soronkénti indításához, akkor semmi gáz, csak éppen több 100-1000 db mkdir fog lefutni, azt viszont meg lehet csinálni xargs nélkül is, a shell saját eszközeivel:


while read line ; do mkdir "$line" ; done < file

- csak ez (ugyanúgy, mint ha xargs -L1 -t használnék) baromi sok processzt indít fölöslegesen.

Természetesen hajlandó vagyok gyakorlati tesztre is vetemedni ha te ezzel ellentétes viselkedést tapasztaltál valahol, de:
- kérek pontos leírást, hogy milyen oprendszerrel és milyen parancsok használata esetén kaptál te "arg list too long" jellegű hibát xargs -szal (-L1 opció nélkül)
- és megírod, hogy melyik az az elbaszott rendszer, ahol az xargs nem azt csinálja, ami a dolga.

Ja és nem sértegetlek, de a fentiek alapján szerintem te nem tudtad, hogy mire is jó az xargs.


cat dirlist.txt | grep -v "^#" | while read dir dummy ; do test -n "$dir" && mkdir "$dir" ; done

ez viszonylag hulyebiztos es me'g a bemeneti listafile-ban a #-tel kezdodo" sorokba kommenteket is tethetsz ;)

Lehet, hogy szükséged lesz az mkdir-nél -p opcióra: no error if existing, make parent directories as needed.

perl -e 'while (<>) { chomp; system "mkdir -p \"$_\""; }'
Es adhatod neki a directorykat :-)