Przenoszenie miliona plików

Potrzebujesz pomocy z C, C++, perl, python, itp.
Awatar użytkownika
LordRuthwen
Moderator
Posty: 2305
Rejestracja: 18 września 2009, 21:45
Lokalizacja: klikash?

Przenoszenie miliona plików

Post 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.
hucul
Beginner
Posty: 189
Rejestracja: 25 listopada 2007, 11:36
Lokalizacja: Warszawa

Post autor: hucul »

Opcja z tarem będzię szybsza niż kopiowanie prze mv.
Spakuj tarem, przekopiuj i rozpakuj i po kłopocie.
Awatar użytkownika
neo86
Beginner
Posty: 285
Rejestracja: 16 października 2013, 00:03
Lokalizacja: Opolskie

Post 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.
Awatar użytkownika
pone13
Beginner
Posty: 337
Rejestracja: 30 listopada 2007, 20:59
Lokalizacja: Leszno

Post autor: pone13 »

Przenieś cały katalog, a nie pliki jeden po drugim?
Awatar użytkownika
LordRuthwen
Moderator
Posty: 2305
Rejestracja: 18 września 2009, 21:45
Lokalizacja: klikash?

Post autor: LordRuthwen »

Nie, chodzi o same pliki.
Awatar użytkownika
kodama
Junior Member
Posty: 633
Rejestracja: 23 maja 2010, 22:30
Lokalizacja: Poznań

Post autor: kodama »

A co złego byłoby właśnie w zaprzęgnięciu rsynca do tego zadania?
Awatar użytkownika
LordRuthwen
Moderator
Posty: 2305
Rejestracja: 18 września 2009, 21:45
Lokalizacja: klikash?

Post 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ć.
ODPOWIEDZ