2012-08-13 11 views
17

Po uruchomieniu polecenia mv folder2/*.* folder pojawia się błąd "zbyt długa lista argumentów".Przenoszenie dużej liczby plików

Znajduję przykład ls i rm, zajmujących się tym błędem, używając find folder2 -name "*.*". Ale mam problem z ich zastosowaniem do mv.

+0

To pytanie jest zadawane, a tu odpowiedzi na S.O. co tydzień. Dowiedz się, jak szukać przed pytaniem. Powodzenia. – shellter

+0

@shellter Znalazłem kilka podobnych przykładów, ale jak już powiedziałem, wszystkie z nich są przykładami 'ls' i' rm'. – DrXCheng

+1

@shellter, jeśli jest tak dużo dupków, znajdź jednego i zagłosuj, aby zamknąć. –

Odpowiedz

47
find folder2 -name '*.*' -exec mv {} folder \; 

-exec biegnie dowolne polecenie, {} wstawia nazwę pliku znaleziony \; oznacza koniec polecenia exec.

+0

Dzięki za odpowiedź, zastanawiam się, ile plików może przenieść mv. Jaki jest limit liczby plików do działania mv. – Thunder

12

Pozostałe odpowiedzi find działają, ale są strasznie wolne w przypadku dużej liczby plików, ponieważ wykonują jedno polecenie dla każdego pliku. Znacznie bardziej efektywne podejście jest albo użyć + na koniec find lub użyj xargs:

# Using find ... -exec + 
find folder2 -name '*.*' -exec mv --target-directory=folder '{}' + 

# Using xargs 
find folder2 -name '*.*' | xargs mv --target-directory=folder 
+0

Zgadzam się normalnie, ale jeśli proste 'mv' generuje błąd" zbyt długa lista argumentów ", wątpię, aby jeden z nich został zbudowany tak długo, jak działa' find'. –

+1

Nie jestem pewien, czy podążam. To jest cały punkt '+' na końcu 'find'. Jeśli użyjesz tego, 'find' zachowuje się dokładnie tak, jak' find | Połączenie xargs'. – Idelic

+0

Powłoka została usunięta, gdy OP próbował przenieść wszystkie pliki naraz. Zarówno 'find', jak i' xargs' w końcu uruchamiają to samo polecenie powłoki, aby faktycznie wykonać ruch, więc prawdopodobnie również będą pomyłki. Dlatego zasugerowałem metodę "jeden na jeden", chociaż jest wolniejszy. –

Powiązane problemy