W odpowiedziach brakuje mi dwóch wahań, więc dodaję jeszcze jeden.
Chociaż przypomina mi to dodanie kolejnej standardowej odpowiedzi ...
Istnieją tutaj dwa problemy:
Mam katalog zawierający około 280 000 plików.
Większość narzędzi nie skaluje się tak dobrze przy tej liczbie plików. Nie tylko większość narzędzi Linuksa lub Windows, ale sporo programów. I może to obejmować twój system plików. Długoterminowym rozwiązaniem byłoby „dobrze, nie rób tego wtedy”. Jeśli masz różne pliki, ale w różnych katalogach. Jeśli nie, możesz spodziewać się kolejnych problemów.
Powiedziawszy to, przejdźmy do rzeczywistego problemu:
Jeśli użyję cp lub mv, pojawia się błąd „lista argumentów jest za długa”
Jest to spowodowane rozszerzeniem * przez powłokę. Powłoka ma ograniczone miejsce na wynik i kończy się. Oznacza to, że każde polecenie z *
rozszerzeniem przez powłokę napotka ten sam problem. Będziesz musiał albo rozwinąć mniej opcji w tym samym czasie, albo użyć innego polecenia.
Jednym z nich jest często używane alternatywne polecenie find
. Jest już kilka odpowiedzi pokazujących, jak z niego korzystać, więc nie zamierzam tego wszystkiego powtarzać. Zwrócę jednak uwagę na różnicę między, \;
a +
ponieważ może to mieć ogromną różnicę w wydajności i ładnie przyłączyć się do poprzedniego wyjaśnienia dotyczącego rozszerzenia.
find /path/to/search --name "*.txt" -exec command {} \;
Znajduje wszystkie pliki w ścieżce / to / search / i wykonuje z nim polecenie, ale zwraca uwagę na cudzysłów wokół *
. To podaje * do polecenia. Gdybyśmy go nie zamknęli ani nie uciekli, powłoka spróbowałaby go rozwinąć i otrzymalibyśmy ten sam błąd.
Na koniec chcę wspomnieć o {}. Te nawiasy zastępowane są treścią znalezioną przez find. Jeśli zakończysz polecenie średnikiem ;
(takim, który musisz uciec z powłoki, stąd \;
w przykładach), wówczas wyniki są przekazywane jeden po drugim. Oznacza to, że wykonasz komendy 280000 mv. Jeden na każdy plik. To może być powolne.
Alternatywnie możesz zakończyć +
. To przekaże jak najwięcej argumentów jednocześnie. Jeśli bash może obsłużyć 2000 argumentów, to find / path -name "* filetype" -exec some_move {} + wywoła komendę some_move około 140 razy, za każdym razem z 2000 argumentami. To jest bardziej wydajne (czytaj: szybciej).
tar
te pliki?