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?

Kod: Zaznacz cały

mv ./* ../
Odpada, tablica to 65k a plików jest milion

Kod: Zaznacz cały

find .. -exec mv ..
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:

Kod: Zaznacz cały

rsync:               7 min 34 sek
tar:                 18 min 32 sek
W sumie już samo:

Kod: Zaznacz cały

ls -l | head -n 64000 | awk '{print $9}'
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ć.