Przenoszenie dużej liczby plików (~ 100 000)

13

Pracuję z folderami, które zawierają wiele plików, na przykład 100 000 lub nawet 1 000 000 plików na folder. Kiedy próbuję przenieść zawartość folderu do innego, mój komputer zawsze się zacina. Nawet gdy proces wydaje się zakończony, nie widzę zawartości żadnego folderu, ponieważ nautilus wydaje się całkowicie zamrożony i muszę zmusić komputer do ponownego uruchomienia. Zauważyłem, że dzieje się tak również wtedy, gdy próbuję przenieść się jak 10 000 plików.

Czy to problem z moim komputerem, czy jest to normalne podczas pracy z tymi liczbami?

Jakiś sprytny sposób na wykonanie tego transferu plików?

Hyperion
źródło
3
Co z użyciem terminalu ( cp -R SRC/ DEST/)
UniversallyUniqueID
2
@BharadwajRaju: W zależności od plików cp -a może być lepszy, ponieważ zachowuje właścicieli, znaczniki czasu i uprawnienia. Polecam także rsync, ponieważ może on weryfikować transfery i kopiuje tylko pliki, które jeszcze nie istnieją.
Michael
Aktualizacja: gvfs-copy(z gvfs-binpakietu) może być szybsza niż cp.
UniversallyUniqueID
Masz tutaj dwa pytania zamiast jednego. Proszę sprawdzić , jak zadawać aktualizacja instrukcji.
Luís de Sousa

Odpowiedzi:

19

Być może rozważ użycie metody czysto wiersza poleceń do przesyłania bardzo dużych ilości plików, bez wątpienia przekonasz się, że proces ten jest znacznie szybszy niż użycie GUI.

Istnieje wiele różnych sposobów osiągnięcia tego celu, ale następujące działały w moim systemie szybko, bezpiecznie i skutecznie:

find . -maxdepth 1 -type f -print0 | xargs -0 mv -t <destination>

Kilka wyjaśnień dla tego polecenia:

  1. Twój katalog wejściowy to „.” znak i dla tego konkretnego polecenia musisz znajdować się w tym katalogu
  2. Twój katalog wyjściowy znajduje się <destination>w moim przykładzie. Oczywiście zmodyfikuj to, aby dostosować do własnych potrzeb i pomiń nawiasy.
  3. Ta składnia pozwala na nazwy plików ze spacjami jako bonus :)

Niekończące się kombinacje są możliwe, ale powinno to działać dobrze i znacznie wydajniej niż GUI. Jedna permutacja na przykład: jeśli chcesz przenieść tylko pliki pdf, możesz uruchomić:

find . -iname "*.pdf" -maxdepth 1 -type f -print0 | xargs -0 mv -t <destination>

Zastosowanie xargsotwiera wiele możliwości, szczególnie przy przenoszeniu tak dużej liczby plików. Wiele, wiele możliwości ...

Potencjalne problemy:

Istnieją następujące 2 potencjalne pułapki do rozważenia, dzięki komentatorom poniżej za te przemyślenia:

  1. Twój katalog docelowy może być uszkodzony, w później nieosiągalnej lokalizacji, błędnie wpisany itp. mvNadal przenosi tam pliki! Uważaj tutaj ...
  2. Jeśli brakuje -topcji ( --target-directory), a folder docelowy jest w rzeczywistości plikiem, przeniesiesz jeden plik, a reszta się nie powiedzie. mvma 2 zastosowania: zmień nazwę źródła na miejsce docelowe lub przenieś źródło do katalogu . Ponownie uważaj ...
andrew.46
źródło
2
Nie find . -maxdepth 1 -type f -exec mv -t test {} +zrobiłbym tak ?
mur 16.04.16
@muru: Dzięki za to, przyciąłem do obcego -name...kawałka, ale odszedłem xargsna miejsce.
andrew.46
2
Nie wiem ... Chociaż polecenie jest oczywiście poprawne w obecnym kształcie, uważam, że pełny ruch jest zbyt podatny na błędy. (Co jeśli na przykład zapomnisz dołączyć -tflagę? Myślę, że wszystkie pliki zostaną „przeniesione” do jednego pojedynczego pliku o nazwie test, co spowoduje utratę wszystkich plików z wyjątkiem jednego.) Myślę, że wolałbym, aby rsyncpotem, jeśli wszystko poszło dobrze, a rm. Mogę jednak wyobrazić sobie scenariusze, w których takiej kontroli nie można zautomatyzować.
Jos
@Jos: Dzięki, dodałem stopkę opisującą tę możliwość. Miło widzieć rsync przykład napisany jako odpowiedź?
andrew.46
Linux obsługuje bardzo długie listy argumentów, więc prawdopodobnie możesz to zrobić mv dir1/* dir2i uciekaj się tylko, find -execjeśli występuje problem lub jeśli chcesz uniknąć dopasowania folderów do globu. (Chociaż w zależności od konwencji nazewnictwa, często *.*pasuje do większości plików, ale nie do większości katalogów, ponieważ często ma się .extensionpliki typu, a często nie ma .nazw katalogów)
Peter Cordes
4

Miałem podobne doświadczenia wcześniej, jest to normalne, gdy mamy do czynienia z dużą liczbą plików. Miałem duży zbiór arkuszy danych PDF (części elektroniczne).

Narzędzia GUI sprawdzają niektóre szczegóły pliku i metadane (Ikona / Miniatura, Rozmiar, ...), w takim przypadku będzie to wielka sprawa. Nawet w widoku ikon i bez miniatur będą się zawieszać, ponieważ większość z nich nie jest zaprojektowana do tak ekstremalnych przypadków. Narzędzie GUI próbuje załadować ikony prezentacji dla wszystkich plików / folderów w katalogu, nawet te elementy nie są widoczne dla użytkownika w bieżącej części ekranu. Sortowanie jest również częścią problemu i nie można go uniknąć.

  • Ostatecznie dzielę pliki na osobne foldery w oparciu o markę / model mniej niż 10000 każdy. Może być możliwe użycie daty (jak większość ludzi robi ze zdjęciami / skanami) lub pierwszej litery (jak w repozytorium pakietów Ubuntu )
  • Zamiast tego łatwiej jest używać narzędzi CLI, ponieważ pokazują one tylko to, o co prosiłeś. Możesz użyć locatedo szybkiego wyszukiwania zamiast find.
  • Do operacji przenoszenia używaj mvw terminalu (narzędzia GUI działają powoli, ponieważ próbują okresowo aktualizować widok).

    Jeśli znajduje się na tej samej partycji, polecenie zmieni tylko wskaźniki w indeksie systemu plików. Jeśli nie, będzie to operacja podwójna (kopiowanie i usuwanie). To będzie drogie.

Jest tylko jeden przypadek, w którym mogę pomóc, jeśli kopiujesz te pliki wiele razy i nie są one aktualizowane. Tak jak zrobiłem, kiedy dzielę się swoją kolekcją z przyjaciółmi, za każdym razem, gdy próbuję skopiować, zajmuje to dekadę. (Jest to bardziej przydatne tylko w przypadku plików o małym rozmiarze)

  • Utwórz jeden pakiet lub kilka pakietów, takich jak zip z brakiem / niskim poziomem kompresji. Kiedy go skopiujesz, przyspieszy, więc pozwól DMA wykonać swoją pracę.
user.dz
źródło
3

Jeśli szukasz rozwiązania, które daje korzyści płynące z operacji w wierszu poleceń z połączeniem interfejsu GUI i elastyczności, polecam mc( dowódca północy ).

mc dowódca widok 2-panelowy

Jest to wizualny menedżer plików oparty na ncurses - masz dwupanelowy widok plików i dostępne menu. Używanie myszy jest możliwe, nawet przez ssh. Możesz przeglądać swój plik fs, sprawdzać pliki za pomocą przeglądarki plików, filtrować według kryteriów w locie i wykonywać operacje kopiowania lub przenoszenia w wierszu poleceń.

Jest to klon dowódcy programu Norton z DOS, który był popularny w połowie lat osiemdziesiątych. Działa dobrze, gdy GUI zaczyna być dla mnie niewiarygodny i idealnie nadaje się do twoich celów.

emk2203
źródło
0

Napotkałem nieco podobne problemy - testowałem moją konfigurację RAID i kiedy wykonuję ogromne transfery (np. Ponad 100 000 plików i 1-2 TB danych za jednym razem) wydaje się, że transfery zaczynają się dość szybko - powiedzmy ~ 200 MB / s, następnie szybko zwolnij do rozsądnego plateau ~ 90-120 MB / s (być może po zużyciu pamięci flash na dyskach). Następnie po 20-30 minutach operacja stopniowo zaczyna spadać do znacznie niższego plateau ~ 30-40 MB / s, gorzej w przypadku małych plików - operacja trwa 4-5 godzin bliżej 15 godzin.

Spędziłem trochę czasu próbując zdiagnozować - np. Możliwe usterki dysku. Pomimo wypróbowania różnych narzędzi - wiersza poleceń, nautilus, nie mogłem utrzymać przyzwoitej przepustowości w przypadku bardzo dużych operacji kopiowania.

Dla mnie najlepsze było użycie komendanta północy i za każdym razem, gdy kopiowanie zwalniało, wstrzymywałem operację, aż zgaśnie lampka dysku twardego po wypłukaniu wszelkich trwających operacji - zwykle około minuty - a następnie ponownie zatrzymaj MC i strzeliłby z powrotem do przyzwoitego tempa przez kolejne 20-30 minut. Raczej denerwujące.

M. Szil
źródło