Fórum Root.cz
		Hlavní témata => Vývoj => Téma založeno: 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áš
			
- 
				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
 
- 
				touch a{0..9}{0..9}{0..9}{0..9}{0..9}{0..9}
 
 -bash: /usr/bin/touch: Argument list too long
 
- 
				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
- 
				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
 done
 a nasledny samotny vytvoreni je pak skoro instantni:
 mkdir targ && cd targ
 xargs touch < ../list.txt
 
 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 ?
- 
				...
 Jaky je to ucel ?
 -Skartace staruch dat ?
 ...
 
 http://www.manpages.info/linux/shred.1.html (http://www.manpages.info/linux/shred.1.html)
- 
				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?
- 
				- Domácí úkol?
 
 
 Semester sa ešte nezačal :D
- 
				Nemam to ted kde vyzkouset, ale co tak pouzit "split"?
 
 neco jako
 split -n1000000 -b0 /dev/zero
- 
				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...