Mam milion zdjęć, które zajmują 30 GB miejsca na dysku, które należy przenieść z jednego katalogu lokalnego do innego katalogu lokalnego.
Jaki byłby najbardziej efektywny sposób to zrobić? Używasz mv
? Używasz cp
? Używasz rsync
? Coś innego?
Muszę wziąć te:
/path/to/old-img-dir/*
00000000.jpg
--------.jpg ## nearly 1M of them! ##
ZZZZZZZZ.jpg
i przenieś je tutaj:
/path/to/new/img/dir/
mv
wydajności, jeśli katalog źródłowy i docelowy znajdują się w tym samym systemie plików.Odpowiedzi:
rsync
byłby złym wyborem, ponieważ wykonuje wiele zadań w tle klient / serwer, które dotyczą systemów lokalnych i zdalnych.mv
jest prawdopodobnie najlepszym wyborem. Jeśli to możliwe, powinieneśmv directory_old directory_new
raczej spróbować niżmv directory_old/* directory_new/
. W ten sposób przesuwasz jedną rzecz zamiast miliona rzeczy.źródło
mv
jeśli mówimy o milionach.mv
aktualizuje tylko informacje imv directory_old directory_new
mv directory_old/* directory_new
find -print0
zxargs -0
pozwala używać spacji w nazwach.xargs -r
nie uruchomi się,mv
chyba że będzie coś do przeniesienia. (mv
narzeka, jeśli nie podano plików źródłowych).mv -t
pozwala określić najpierw miejsce docelowe, a następnie pliki źródłowe, potrzebne przezxargs
.Nawiasem mówiąc, zadałbym sobie pytanie, czy naprawdę muszę przenieść tak dużą liczbę plików jednocześnie. Przetwarzanie wsadowe jest przereklamowane. Staram się nie gromadzić ogromnej ilości pracy, jeśli potrafię przetwarzać rzeczy w momencie ich wygenerowania.
źródło
Jeśli dwa katalogi znajdują się w tym samym systemie plików, użyj
mv
katalogu DIRECTORY, a nie zawartości katalogu.Jeśli rezydują w dwóch różnych systemach plików, użyj rsync:
rsync -av /source/directory/ /destination
Zwróć uwagę na końcowe
/
źródło. Oznacza to, że skopiuje ZAWARTOŚĆ katalogu, a nie sam katalog. Jeśli wyłączysz/
, nadal będzie kopiować pliki, ale będą one znajdować się w katalogu o nazwie/destination/directory
. Z /, pliki będą po prostu w/destination
rsync
zachowa własność pliku, jeśli uruchomisz go jako root lub jeśli pliki są Twoją własnością. Będzie także utrzymywaćmtime
każdy pojedynczy plik.źródło
rsync
Wydaje się , że do kopiowania dużego folderu z jednego dysku twardego na inny dysk twardy krąży wokółmv
. Dzięki za wskazówkę!Kiedy używasz „cp”, każdy plik wykonuje polecenie otwórz-przeczytaj-zamknij-otwórz-zapisz-zamknij. Tar używa różnych procesów do odczytu i zapisu, a także wielu stopni do obsługi wielu plików jednocześnie. Nawet w przypadku pojedynczego procesora aplikacje wielowątkowe są szybsze.
źródło
tar c | tar x
, otrzymasz koszt O (całkowity rozmiar) zamiast O (liczba_plików).Ponieważ zarówno katalog_główny, jak i nowy katalog znajdują się w tym samym systemie plików, którego można użyć
cp -l
zamiastmv
jako opcji.cp -l
utworzy twarde linki do oryginalnych plików. Kiedy skończysz z 'move' i będziesz zadowolony z rezultatu, możesz usunąć te pliki z katalogu_older. jeśli chodzi o szybkość, będzie on taki sam jak „mv”, ponieważ najpierw tworzysz linki, a następnie usuwasz oryginalne. Ale to podejście pozwala zacząć od początku, jeśli ma to sensźródło
To zależy (tm). Jeśli twój system plików to kopiowanie przy zapisie, wówczas kopiowanie (
cp
lubrsync
, na przykład) powinno być porównywalne z przeniesieniem. Ale w najczęstszych przypadkach move (mv
) będzie najszybszy, ponieważ może po prostu przełączać fragmenty danych opisujące miejsce umieszczenia pliku (uwaga: jest to zbyt uproszczone).Tak więc, przy przeciętnej instalacji Linuksa, wybrałbym
mv
.EDYCJA: @ Frédéric Hamidi ma rację w komentarzach: Jest to poprawne tylko wtedy, gdy oba są na tym samym systemie plików i dysku. W przeciwnym razie dane i tak zostaną skopiowane.
źródło
Aby skopiować co najmniej ~ 10 000 plików (bez katalogów), cp narzekał:
Najlepszą opcją jest Rsync:
I zrobiono to bardzo szybko!
źródło
Jeśli masz wolne miejsce, zarchiwizuj je w jednym pliku .tar (bez kompresji jest szybszy), a następnie przenieś ten plik i zarchiwizuj go.
źródło
Charakter miejsca docelowego określałby najbardziej efektywny sposób wykonania tego zadania. Załóżmy, że jesteś na systemie lokalnym, twój
PWD
jest/
teraz. i/a
zawiera miliony zdjęć. Naszym zadaniem jest przeniesienie wszystkich obrazów/b
przy zachowaniu całej struktury podkatalogów. Załóżmy również/a
i/b
są punktami montowania dla dwóch różnych partycji, każda na dysku podłączonym lokalnie. Chcielibyśmy wykonać to zadanie za pomocą plandeki. Może to zająć trochę czasu, więc upewnij się, że używaszscreen
,tmux
lub wykonać to jako proces w tle.To by skopiować wszystkie pliki i katalogi w
/a
celu/b
, więc teraz trzeba posprzątać/a
po potwierdzić to zakończone bez błędu.źródło