Przenoszenie dużej ilości plików
Napisał: Patryk Krawaczyński
16/06/2009 w Administracja Brak komentarzy. (artykuł nr 73, ilość słów: 248)
O
d czasu do czasu zdarzy się potrzeba przeniesienia kilku plików w systemie. Oczywiście nie ma z tym większego problemu, wystarczy użyć polecenia: “mv katalog1/* katalog2/”. Problem pojawia się w momencie, gdy specjalny znak gwiazdki (ang. asterisk) przy bardzo dużej liczbie plików powoduje, że każdy plik w katalogu źródłowym zostaje dodany jako parametr linii poleceń komendy mv. Spowodować może to przepełnienie buforu linii poleceń i zakończenie programu z błędem: "Too many arguments"
(Zbyt wiele argumentów).
Z tego rodzaju problemem można się spotkać korzystając z polecenia mv, przenosząc zawartość katalogu, która liczy powyżej miliona plików. Oczywiście nie każdego dnia zdarza się przenosić taką ilość plików, lecz napotykając na tego rodzaju problem – lepiej mieć już gotowe rozwiązanie – polegające na użyciu poręcznego programu xargs, który został zaprojektowany by pobierać dużą listę argumentów ze standardowego wejścia i przekazać je jako odseparowane argumenty do innego polecenia:
find katalog1 -type f -print | xargs -l1 -i mv {} katalog2/
Parametr -l1
mówi xargs by przekazywał po jednym argumencie na raz do programu mv. Natomiast parametr -i
mówi xargs, że przekazywany argument powinien zostać wstawiony w miejsce “klamer” {}. W ten sposób cała składnia spowoduje wykonanie polecenia mv dla każdego pliku w katalogu źródłowym. Optymalizacją dla tego rozwiązania byłoby przekazanie np. 50 argumentów (nazw plików) na raz do polecenia move poprzez parametr -l50
, jednak w systemie Linux xargs przy użyciu równocześnie parametru -i (--replace)
wymusza przekazanie tylko jednego argumentu na raz.