Jak vytvořit 1 000 000 položek

Lukáš_

Jak vytvořit 1 000 000 položek
« kdy: 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áš


Unixx

Re:Jak vytvořit 1 000 000 položek
« Odpověď #1 kdy: 13. 09. 2015, 12:43:41 »
touch

Kit

Re:Jak vytvořit 1 000 000 položek
« Odpověď #2 kdy: 13. 09. 2015, 13:01:31 »
Kód: [Vybrat]
touch a{0..9}{0..9}{0..9}{0..9}{0..9}{0..9}

Neviditelný

Re:Jak vytvořit 1 000 000 položek
« Odpověď #3 kdy: 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

sdasdasdasd

Re:Jak vytvořit 1 000 000 položek
« Odpověď #4 kdy: 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


PJ

Re:Jak vytvořit 1 000 000 položek
« Odpověď #5 kdy: 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

fade

Re:Jak vytvořit 1 000 000 položek
« Odpověď #6 kdy: 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

Re:Jak vytvořit 1 000 000 položek
« Odpověď #7 kdy: 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 :)

fade

Re:Jak vytvořit 1 000 000 položek
« Odpověď #8 kdy: 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.

Re:Jak vytvořit 1 000 000 položek
« Odpověď #9 kdy: 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

Re:Jak vytvořit 1 000 000 položek
« Odpověď #10 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 ?

Re:Jak vytvořit 1 000 000 položek
« Odpověď #11 kdy: 14. 09. 2015, 11:22:11 »

Inkvizitor

Re:Jak vytvořit 1 000 000 položek
« Odpověď #12 kdy: 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?

noname

Re:Jak vytvořit 1 000 000 položek
« Odpověď #13 kdy: 14. 09. 2015, 14:53:42 »
- Domácí úkol?

Semester sa ešte nezačal :D

Randolf

Re:Jak vytvořit 1 000 000 položek
« Odpověď #14 kdy: 14. 09. 2015, 16:34:09 »
Nemam to ted kde vyzkouset, ale co tak pouzit "split"?

neco jako
split -n1000000 -b0 /dev/zero