Strona 1 z 1
Przenoszenie miliona plików
: 07 października 2014, 21:31
autor: LordRuthwen
Mam taki akademicki problem - prawdopodobnie się nie zdarzy, ale mnie nurtuje odpowiedź na niego:
Jest sobie katalog, nazwijmy go kat1, w nim jest kolejny katalog, powiedzmy kat2. W katalogu kat2 znajduje się milion plików o losowych nazwach.
Jak przenieść te pliki to katalogu wyżej?
Odpada, tablica to 65k a plików jest milion
Też odpada, wtedy mv odpali się milion razy a chodzi o zmniejszenie ilości operacji.
Czekam na sugestie
Zastanawiam się nad tarem lub rsync-iem.
: 07 października 2014, 23:34
autor: hucul
Opcja z tarem będzię szybsza niż kopiowanie prze mv.
Spakuj tarem, przekopiuj i rozpakuj i po kłopocie.
: 08 października 2014, 21:21
autor: neo86
hucul pisze:Spakuj tarem, przekopiuj i rozpakuj i po kłopocie.
Zależy jakie to pliki :] Ja ostatnio ponad tysiąc plików wideo kopiowałem z dysku na dysk. Łącznie było coś koło 1,5TB danych. W terminalu biegły nie jestem... Ja tam lubię bardziej graficznie więc użyłem sobie Midnight Commander który poradził sobie z tym zadaniem doskonale.
: 09 października 2014, 10:42
autor: pone13
Przenieś cały katalog, a nie pliki jeden po drugim?
: 09 października 2014, 12:09
autor: LordRuthwen
Nie, chodzi o same pliki.
: 09 października 2014, 22:51
autor: kodama
A co złego byłoby właśnie w zaprzęgnięciu rsynca do tego zadania?
: 14 października 2014, 14:29
autor: LordRuthwen
Nic złego by nie było, zastanawiałem się po prostu jak by to najlepiej zrobić.
Po głowie chodziły mi dwie możliwości: tar i rsync
Ilość plików na jakiej testowałem: 1064001 - zwykłe czyste pliki o wadze 0 bajtów tworzone za pomocą touch.
Maszyna testowa:
Procesor: Intel(R) Xeon(R) CPU E5410 @ 2.33GHz
RAM: 2 GB
System: Debian Wheezy 3.2.0-4-686-pae
Polecenie rsync:
Kod: Zaznacz cały
rsync -d --remove-source-files /home/test/sub1/ /home/test/
Tara ogarnąłem takim niezbyt eleganckim skryptem:
Kod: Zaznacz cały
#!/bin/bash
cd /home/test/sub1
for i in {1..1000}
do
if [ `ls -l | wc -l` -gt "0" ]; then
tar --remove-files -cf ../arch$i.tar `ls -l | head -n 64000 | awk '{print $9}'`
else
cd /home/test
for file in ./*.tar ;do tar -xf $file ; done
exit 0
fi
done
Czasowo wykonywanie tego wygląda tak:
W sumie już samo:
chwilę trwało, więc nie jest to specjalnie miarodajne a na chwilę obecną nie miałem pomysłu jakby to można było inaczej zrobić.