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?
- 2776 megtekintés
Hozzászólások
cat nevek | xargs mkdir
--
Debian - The "What?!" starts not!
http://nyizsa.uni.cc
- A hozzászóláshoz be kell jelentkezni
Majdnem jó.
cat nevek | xargs -d '\n' mkdir
Egy sor - egy könyvtár, akár space is lehet benne.
- A hozzászóláshoz be kell jelentkezni
Köszönöm, ezzel szépen megcsináltam.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
mkdir `cat nevek`
- A hozzászóláshoz be kell jelentkezni
Mondjuk nyizsa megoldása akkor is működik, ha több tízezer fájlnév van abban a fájlban, a tied akkor már nem. De hogy konstruktív is legyek, rövidítem (és olcsóbbá teszem :-) ) az övét.
xargs mkdir < nevek
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
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.)
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
Bocs, igazad van.
- A hozzászóláshoz be kell jelentkezni
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 ;)
- A hozzászóláshoz be kell jelentkezni
Nem gepironoknek:
grep -v "^#" dirlist.txt | xargs -L1 mkdir
Igen, van hibajelzes, ha a directory mar letezik, de ez gyakran nem fontos, sot '2>/dev/null' is kerulhet a vegere.
- A hozzászóláshoz be kell jelentkezni
Lehet, hogy szükséged lesz az mkdir-nél -p opcióra: no error if existing, make parent directories as needed.
- A hozzászóláshoz be kell jelentkezni
perl -e 'while (<>) { chomp; system "mkdir -p \"$_\""; }'
Es adhatod neki a directorykat :-)
- A hozzászóláshoz be kell jelentkezni