Istnieje maksymalny limit długości listy argumentów dla komend systemowych - limit ten jest specyficzny dla dystrybucji na podstawie wartości MAX_ARG_PAGES
czasu kompilacji jądra i nie można go zmienić bez ponownej kompilacji jądra.
Ze względu na sposób, w jaki powłoka obsługuje globbing, wpłynie to na większość poleceń systemowych, gdy użyjesz tego samego argumentu („* .jpg”). Ponieważ glob jest najpierw przetwarzany przez powłokę, a następnie wysyłany do polecenia, polecenie:
cp -uf *.jpg /targetdir/
jest zasadniczo taki sam jak powłoka, tak jakbyś napisał:
cp -uf 1.jpg 2.jpg ... n-1.jpg n.jpg /targetdir/
Jeśli masz do czynienia z wieloma plikami JPEG, może to bardzo szybko stać się niemożliwe do opanowania. W zależności od konwencji nazewnictwa i liczby faktycznie przetwarzanych plików, możesz uruchomić polecenie cp w innym podzbiorze katalogu na raz:
cp -uf /sourcedir/[a-m]*.jpg /targetdir/
cp -uf /sourcedir/[n-z]*.jpg /targetdir/
Może to działać, ale dokładna skuteczność zależy od tego, jak dobrze możesz podzielić listę plików na wygodne globalne bloki.
Globalny. Lubię to słowo.
Niektóre polecenia, takie jak find i xargs , mogą obsługiwać duże listy plików bez tworzenia list argumentów o boleśnie dużych rozmiarach.
find /sourcedir/ -name '*.jpg' -exec cp -uf {} /targetdir/ \;
Argument -exec uruchomi resztę wiersza poleceń jeden raz dla każdego znalezionego pliku przez find , zastępując {} każdą znalezioną nazwą pliku. Ponieważ polecenie cp jest uruchamiane tylko na jednym pliku na raz, limit listy argumentów nie stanowi problemu.
Może to być powolne ze względu na konieczność przetwarzania każdego pliku osobno. Korzystanie z xargs może zapewnić bardziej wydajne rozwiązanie:
find /sourcedir/ -name '*.jpg' -print0 | xargs -0 cp -uf -t /destdir/
xargs może pobrać pełną listę plików dostarczoną przez find i podzielić ją na listy argumentów o zarządzalnych rozmiarach i uruchomić cp na każdej z tych podlist.
Oczywiście istnieje również możliwość ponownej kompilacji jądra, ustawiając większą wartość dla MAX_ARG_PAGES
. Jednak rekompilacja jądra to więcej pracy, niż zamierzam wyjaśnić w tej odpowiedzi.