Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Lukáš_ 13. 09. 2015, 12:38:45

Název: Jak vytvořit 1 000 000 položek
Přispěvatel: Lukáš_ 13. 09. 2015, 12:38:45
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áš
Název: Re:Jak vytvořit 1 000 000 položek
Přispěvatel: Unixx 13. 09. 2015, 12:43:41
touch
Název: Re:Jak vytvořit 1 000 000 položek
Přispěvatel: Kit 13. 09. 2015, 13:01:31
Kód: [Vybrat]
touch a{0..9}{0..9}{0..9}{0..9}{0..9}{0..9}
Název: Re:Jak vytvořit 1 000 000 položek
Přispěvatel: Neviditelný 13. 09. 2015, 15:41:55
Kód: [Vybrat]
for i in {0..1000000}; do n=$RANDOM; ((n=n%2)); if [[ n -eq 0 ]]; then mkdir $i; else touch $i; fi; done
Název: Re:Jak vytvořit 1 000 000 položek
Přispěvatel: sdasdasdasd 13. 09. 2015, 16:06:54
Kód: [Vybrat]
touch a{0..9}{0..9}{0..9}{0..9}{0..9}{0..9}

-bash: /usr/bin/touch: Argument list too long
Název: Re:Jak vytvořit 1 000 000 položek
Přispěvatel: PJ 13. 09. 2015, 16:46:10
Kód: [Vybrat]
touch a{0..9}{0..9}{0..9}{0..9}{0..9}{0..9}

-bash: /usr/bin/touch: Argument list too long
Kód: [Vybrat]
echo a{0..9}{0..9}{0..9}{0..9}{0..9}{0..9} | xargs touch
Název: Re:Jak vytvořit 1 000 000 položek
Přispěvatel: fade 13. 09. 2015, 18:06:08
Tak ztucnit kod zrejme nemuzu....
Kód: [Vybrat]
#!/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
Název: Re:Jak vytvořit 1 000 000 položek
Přispěvatel: Tomaskom 13. 09. 2015, 23:09:56
Tak ztucnit kod zrejme nemuzu....
Kód: [Vybrat]
#!/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:
Kód: [Vybrat]
#!/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
done

a nasledny samotny vytvoreni je pak skoro instantni:
Kód: [Vybrat]
mkdir targ && cd targ
xargs touch < ../list.txt


Kód: [Vybrat]
echo a{0..9}{0..9}{0..9}{0..9}{0..9}{0..9} | xargs touch
Tohle bude samozrejme porad nejrychlejsi :)
Název: Re:Jak vytvořit 1 000 000 položek
Přispěvatel: fade 14. 09. 2015, 03:11:34
Tak rychlý to asi je. Jen to neni náhodný a mít příkazy s 100000+ argumentů taky neni uplně košer.
Název: Re:Jak vytvořit 1 000 000 položek
Přispěvatel: Honza1Ubuntu 14. 09. 2015, 10:32:41
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.

Kód: [Vybrat]
#!/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.

Kód: [Vybrat]
#!/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
Název: Re:Jak vytvořit 1 000 000 položek
Přispěvatel: Honza1Ubuntu 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 ?
Název: Re:Jak vytvořit 1 000 000 položek
Přispěvatel: hawran diskuse 14. 09. 2015, 11:22:11
...
Jaky je to ucel ?
-Skartace staruch dat ?
...
http://www.manpages.info/linux/shred.1.html (http://www.manpages.info/linux/shred.1.html)
Název: Re:Jak vytvořit 1 000 000 položek
Přispěvatel: Inkvizitor 14. 09. 2015, 14:23:53
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?
Název: Re:Jak vytvořit 1 000 000 položek
Přispěvatel: noname 14. 09. 2015, 14:53:42
- Domácí úkol?

Semester sa ešte nezačal :D
Název: Re:Jak vytvořit 1 000 000 položek
Přispěvatel: Randolf 14. 09. 2015, 16:34:09
Nemam to ted kde vyzkouset, ale co tak pouzit "split"?

neco jako
split -n1000000 -b0 /dev/zero
Název: Re:Jak vytvořit 1 000 000 položek
Přispěvatel: Zopper 14. 09. 2015, 18:34:08
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.


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.

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