Po uruchomieniu polecenia typu pojawia ls */*/*/*/*.jpg
się błąd
-bash: /bin/ls: Argument list too long
Wiem, dlaczego tak się dzieje: dzieje się tak dlatego, że istnieje limit ilości miejsca na argumenty polecenia. Standardowa rada to zmiana polecenia, którego używam, aby uniknąć konieczności zajmowania tak dużej ilości argumentów (np. Użyj find
i xargs
).
Co jeśli nie chcę zmieniać polecenia? Co jeśli chcę nadal używać tego samego polecenia? Jak mogę sprawić, by rzeczy „po prostu działały” bez wyświetlania tego błędu? Jakie rozwiązania są dostępne?
Odpowiedzi:
W systemie Linux maksymalna ilość miejsca na argumenty poleceń wynosi 1/4 ilości dostępnego miejsca na stosie. Tak więc rozwiązaniem jest zwiększenie ilości miejsca dostępnego dla stosu.
Krótka wersja: uruchom coś w stylu
Dłuższa wersja: domyślna ilość miejsca dostępna dla stosu to około 8192 KB. Ilość dostępnego miejsca możesz zobaczyć w następujący sposób:
Wybierz większą liczbę i ustaw ilość dostępnego miejsca dla stosu. Na przykład, jeśli chcesz spróbować zezwalać na stos do 65536 KB, uruchom to:
Być może będziesz musiał się zastanowić, jak duży musi to być, używając metody prób i błędów. W wielu przypadkach jest to szybkie i-brudny rozwiązanie, które wyeliminuje konieczność modyfikowania polecenia i wypracować składni
find
,xargs
itp (choć zdaję sobie sprawę, że istnieją inne korzyści tak robi).Uważam, że jest to specyficzne dla systemu Linux. Podejrzewam, że prawdopodobnie nie pomoże na żadnym innym systemie operacyjnym Unix (nie testowanym).
źródło
Artykuł w Linux Journal zawiera 4 rozwiązania. Tylko czwarte rozwiązanie nie wymaga zmiany polecenia:
Zgadzam się, że ograniczenie jest bardzo denerwujące.
źródło
Zamiast tego
ls */*/*/*/*.jpg
spróbuj:xargs
(1) wie, jaka jest maksymalna liczba argumentów w systemie, i rozbije standardowe wejście, aby wywołać określony wiersz poleceń wiele razy, nie więcej niż argumenty powyżej tego limitu, cokolwiek to jest (możesz również ustawić go na wartość niższą niż maksimum systemu operacyjnego za pomocą-n
opcji).Załóżmy na przykład, że limit wynosi 3 argumenty i masz pięć plików. W takim przypadku
xargs
wykona sięls
dwukrotnie:ls 1.jpg 2.jpg 3.jpg
ls 4.jpg 5.jpg
Często jest to całkowicie odpowiednie, ale nie zawsze - na przykład nie możesz polegać na
ls
(1) sortowaniu wszystkich wpisów dla siebie poprawnie, ponieważ każde osobnels
wywołanie posortuje tylko podzbiór wpisów mu podanychxargs
.Chociaż możesz podnieść limit, jak sugerują inni, nadal będzie limit - i pewnego dnia twoja kolekcja JPG ponownie go przerośnie. Powinieneś przygotować swój skrypt (y) do obsługi nieskończonej liczby ...
źródło
Argument list too long
, aleecho
zamiast nichls
w powłokach, w którychecho
nie ma wbudowanego polecenia powłoki? (Może to nie jest problem w większości pocisków, więc może to nie ma znaczenia.)find
przekazanie-print0
jego wyników zaxargs
pomocą-0
opcji.echo
jest wbudowaną powłoką i nie podlega ograniczeniom wiersza poleceńexec
(3).