Ahoj kluci, nejsem programátor ale nevím kde se jinde zeptat. Potřeboval bych v linuxu vytvořit soubory a adresáře s náhodným názvem aby počet byl cca 1 000 000 (vše v jednom adresáři), na poměru subor/adresář nezáleží, nezáleží ani na délce názvu, pomohlo by mi krátké i velmi dlouhé názvy. Neví prosím někdo o něčem ? Předem děkuji, Lukáš
touch
touch a{0..9}{0..9}{0..9}{0..9}{0..9}{0..9}
for i in {0..1000000}; do n=$RANDOM; ((n=n%2)); if [[ n -eq 0 ]]; then mkdir $i; else touch $i; fi; done
Citace od: Kit kdy 13. 09. 2015, 13:01:31
touch a{0..9}{0..9}{0..9}{0..9}{0..9}{0..9}
-bash: /usr/bin/touch: Argument list too long
Citace od: sdasdasdasd kdy 13. 09. 2015, 16:06:54
Citace od: Kit kdy 13. 09. 2015, 13:01:31
touch a{0..9}{0..9}{0..9}{0..9}{0..9}{0..9}
-bash: /usr/bin/touch: Argument list too long
echo a{0..9}{0..9}{0..9}{0..9}{0..9}{0..9} | xargs touch
Tak ztucnit kod zrejme nemuzu....
#!/bin/bash
i=0
while [ $((i++)) -lt 100000 ]; do
# $i-$(date +%s) je seed pro md5sum
name="$(md5sum <<< $i-$(date +%s) | awk '{printf $1}')"
# jako jmeno (nahodne) uriznu prvnich 10-30 znaku
touch "${name:0:$((RANDOM % 20+10))}"
done
Citace od: fade kdy 13. 09. 2015, 18:06:08
Tak ztucnit kod zrejme nemuzu....
#!/bin/bash
i=0
while [ $((i++)) -lt 100000 ]; do
# $i-$(date +%s) je seed pro md5sum
name="$(md5sum <<< $i-$(date +%s) | awk '{printf $1}')"
# jako jmeno (nahodne) uriznu prvnich 10-30 znaku
touch "${name:0:$((RANDOM % 20+10))}"
done
Zjistil sem, ze je asi o tretinu rychlejsi si jmena napred nagenerovat do souboru:
#!/bin/bash
echo -n "" > list.txt
i=0
while [ $((i++)) -lt 100000 ]; do
# $i-$(date +%s) je seed pro md5sum
name="$(md5sum <<< $i-$(date +%s) | awk '{printf $1}')"
# jako jmeno (nahodne) uriznu prvnich 10-30 znaku
echo "${name:0:$((RANDOM % 20+10))}" >> list.txt
donea nasledny samotny vytvoreni je pak skoro instantni:
mkdir targ && cd targ
xargs touch < ../list.txtCitace od: PJ kdy 13. 09. 2015, 16:46:10
echo a{0..9}{0..9}{0..9}{0..9}{0..9}{0..9} | xargs touch
Tohle bude samozrejme porad nejrychlejsi :)
Tak rychlý to asi je. Jen to neni náhodný a mít příkazy s 100000+ argumentů taky neni uplně košer.
Pokut narves 1000 argumentu do 1 cyklu, muze to taky napsat "Argument list too long" a 1 000 000 souboru v jednom adresari je sranda, i 100 000 souboru.
Takto v Bashi ti vytvori dost souboru a slozek. Zadas cislo pocet a vytvori ti to pocet^2 zslozek a pocet^3 souboru, vsechny stejne. Jinak. min velisost souboru i velikost adresare je 4096 B obvykle, tedy jeden cluster. Limity na pocet souboru jsou ruzne, vetsinou milion az miliarda. Misto kde probehne utok je CestaDoTvehoAdreare , zadas bez posledniho lomitka.
#!/bin/bash
CestaDoTvehoAdreare="/tmp/neco"
pocet="1000"
for XXX in `seq -w ${pocet}` ; do
for YYY in `seq -w ${pocet}` ; do
mkdir -p ${CestaDoTvehoAdreare}/${XXX}/${XXX}${YYY}/
for ZZZ in `seq -w ${pocet}` ; do
echo "Drsnej skript to je" >> ${CestaDoTvehoAdreare}/${XXX}/${XXX}${YYY}/${XXX}${YYY}${ZZZ}.txt
done
done
done
Jinak pokud chces skartovat obsah disku, tak az cca 11x prepsane jde obnovit. Proto meni moddifikace skriptu o cyklus vic:
Bacha je tu rm -fr *, ujisti se zda dany adresar, ktery se iotevre pred spustenim priklazu existuje, jinak to bude mazat jinde.
Mysli i na cas behu skriptu.
#!/bin/bash
CestaDoTvehoAdreare="/tmp"
pocet="1000"
PocetCyklu="50"
for Cykly in `seq ${PocetCyklu}` ; do
for XXX in `seq -w ${pocet}` ; do
for YYY in `seq -w ${pocet}` ; do
mkdir -p ${CestaDoTvehoAdreare}/${XXX}/${XXX}${YYY}/
for ZZZ in `seq -w ${pocet}` ; do
echo "Drsnej skript to je" >> ${CestaDoTvehoAdreare}/${XXX}/${XXX}${YYY}/${XXX}${YYY}${ZZZ}.txt
done
done
done
cd ${CestaDoTvehoAdreare}/
rm -fr *
done ## cykly
Oprava prvni vety - 1000 argumentu v cyklu je OK.Ale co vim, tak limit je prave cca 1 000 000, ne pocet argumentu ale velikost vyctu v promennych v pameti max. 1 MB ci tak neco. Tedy pokud max 1 polozka 20 znaku, max. 50 000. Ten muj skript neni nahodny, ale ucel asi splnuje.
Jaky je to ucel ?
-Skartace staruch dat ?
-Kurveni disku ve firme nebo skole ?
Citace od: Honza1Ubuntu kdy 14. 09. 2015, 10:38:37
...
Jaky je to ucel ?
-Skartace staruch dat ?
...
http://www.manpages.info/linux/shred.1.html (http://www.manpages.info/linux/shred.1.html)
Citace od: Honza1Ubuntu kdy 14. 09. 2015, 10:38:37
Oprava prvni vety - 1000 argumentu v cyklu je OK.Ale co vim, tak limit je prave cca 1 000 000, ne pocet argumentu ale velikost vyctu v promennych v pameti max. 1 MB ci tak neco. Tedy pokud max 1 polozka 20 znaku, max. 50 000. Ten muj skript neni nahodny, ale ucel asi splnuje.
Jaky je to ucel ?
-Skartace staruch dat ?
-Kurveni disku ve firme nebo skole ?
- Domácí úkol?
Nemam to ted kde vyzkouset, ale co tak pouzit "split"?
neco jako
split -n1000000 -b0 /dev/zero
Citace od: Honza1Ubuntu kdy 14. 09. 2015, 10:32:41
Jinak pokud chces skartovat obsah disku, tak az cca 11x prepsane jde obnovit.
Ne. Tohle platilo někdy v devadesátých letech. Moderní disky (po roce 2000, či lépe po roce 2006) už mají datové stopy tak blízko, že se naopak spíš normálními zápisy ovlivňují okolní buňky a jednorázový přepis je dostatečný. A to vůbec nemluvím o té ohavnosti SMR, kde zápisová hlava zapisuje na několik buněk to stejnou hodnotu, protože ty buňky jsou násobně menší než hlava samotná. A tak se postupuje jako u pokládání šindelů (nebo střešních krytin obecně) - zapíše se hodnota, posune se o 1/n hlavy, zapíše se jiná hodnota (a přitom se přepíše 90% plochy na kterou se zapsalo v předchozím zápisu. Samozřejmě pak změna jedné buňky znamená, že se musí přečíst větší blok dat a ten pak zase celý zapsat. Z tohohle ti ale už nikdo přepsaná data nevytáhne.
Na mazání souborů jsou utility (třeba
shred), na smazání celého disku pak stačí
dd. A pokud chci mít jistotu (třeba že část dat není uložená někde v elektronice disku), tak fyzicky zlikvidovat, tady přepisy nepomůžou.
Citace od: Lukáš_ kdy 13. 09. 2015, 12:38:45aby počet byl cca 1 000 000 (vše v jednom adresáři), na poměru subor/adresář nezáleží, nezáleží ani na délce názvu, pomohlo by mi krátké i velmi dlouhé názvy.
Nejrychlejší by bylo použít nějaký z benchmarkovacích nástrojů na io, např. FIO, nebo iozone. Skládání bashových konstrukcí bude vždycky běžet déle. Na druhou stranu ale nevím, jeslti se takhle dají udělat dlouhé názvy. Je tedy otázka, jak moc tě zajímá rychlost...