xargs – polecenieuniksowych i większościuniksopodobnych systemów operacyjnych, używane do budowania i wykonywania poleceń zestandardowego wejścia.Jądro Linuxa o wersji do 2.6.23 nie może pobierać dowolnie długiej listy argumentów[1], więc zadaniem xargs jest podzielenie jej na wystarczająco małe podlisty.
Na przykład polecenie:
rm/path/*
lub
rm`find/path-typef`
może spowodować błąd i wyświetlenie komunikatu: "Argument list too long" jeżeli w/path znajduje się zbyt wiele plików. Jednakże poniższa wersja (odpowiednikrm `find /path -type f`) nie powinna już sprawiać kłopotów:
find/path-typef-print0|xargs-0rmW tym przykładzie,find przesyła na wejściexargs długą listę nazw plików.Xargs dokonuje podziału na podlisty i dopiero wtedy wywołuje polecenierm dla każdej z nich. To polecenie jest wydajniejsze niż gdybyśmy chcieli napisać:
find/path-typef-execrm'{}'\;
co spowoduje wywołanierm dla każdego, pojedynczego pliku. Warto jednak zwrócić uwagę na to, że w nowszych wersjachfind poniższy wariant wykonuje dokładnie to samo, co wersja z użyciemxargs:
find/path-typef-execrm'{}'+xargs często wykazuje się takim samym działaniem, jakbackquote, lecz jest on bardziej uniwersalny i okazuje się bezpieczniejszym gdy na wejściu pojawiają się znaki białe lub specjalne. Dobrze łączyć go z poleceniami zwracającymi długie listy plików, jak chociażbyfind,locate, czygrep. Musimy jednak pamiętać wtedy o parametrze -0, jako że bez niego xargs nie radzi sobie najlepiej z nazwami zawierającymi ', " i spacje.
find.-name"*.foo"|xargsgrepbar
Równoznaczne z:
grepbar`find.-name"*.foo"`
Zauważ, że powyższa komenda korzysta z odwróconych apostrofów (`) zamiast zwykłych ('). Jej zadaniem jest odnalezienie wszystkich plików orozszerzeniu.foo, zawierających słowobar, położonych w bieżącymfolderze oraz w jego podkatalogach. Żadne z tych poleceń nie zadziała, jeżeli wśród nazw plików znajdują się białe znaki. Możemy rozwiązać ten problem wpisując:
find.-name"*.foo"-print0|xargs-0grepbar
W ten sposób możemy wyodrębnić nazwy plików, rozwiązując tym samym problem z białymi znakami;
find.-name"*.foo"-print0|xargs-0-t-rvi
Polecenie to przypomina poprzednie, jednakowoż uruchamia onoedytor vi dla każdego z plików. Flaga-t powoduje wypisanie komendy do strumienia stderr przed przystąpieniem do jej realizacji.-r jest rozszerzeniem GNU informującym, żexargs nie wykona polecenia jeżeli nie otrzyma nic na wejście.
find.-name"*.foo"-print0|xargs-0-I{}mv{}/tmp/trash
Powyższa komenda korzysta z-I aby rozkazaćxargs wypełnienie{} listą argumentów. Pamiętaj jednak, że nie wszystkie wersjexargs wspomagają składnię{}. W takim wypadku możesz napisać np:
find.-name"*.foo"-print0|xargs-0-Ixxxmvxxx/tmp/trash
Powyższe polecenie wykorzystujexxx zamiast{} jako znacznik listy argumentów.
find.-maxdepth1-typef-name"*.ogg"-print0|xargs-0-rcp-v-p--target-directory=/home/media
To polecenie to nic innego jak:
cp-v-p*.ogg/home/media
lecz nie zajmuje ono tak wielu zasobów, kosztem niezwracania błędu kiedy poleceniecp otrzyma więcej plików niż może obsłużyć. Innym sposobem (w którym to sami decydujemy, gdzie umieścimy argumenty) to:
find.-maxdepth1-typef-name"*.ogg"-print0|xargs-0-IMYFILEScpMYFILES/home/media
Znak-I w powyższej linii poleceń informujexargs o tym z którego słowa zastępczego chcesz skorzystać (w przeciwnym wypadku doda argumenty na końcu komendy). Oprócz tego możesz użyć atrybutu-L w celu ograniczenia liczby argumentów. Wtedy polecenie będzie uruchamiane ponownie, aż do wyczerpania listy argumentów. Zaś użycie-L1 spowoduje uruchomienie programu tylko raz dla każdego z zadanych argumentów.
Wiele uniksowych narzędzi jest zorientowanych liniowo. Będą one więc działać z xargs tak długo, jak linie nie zawierają'," lub spacji. Część uniksowych narzędzi może użyć znaku NUL jako separatora (np.perl (wymaga-0 i\0 zamiast\n),locate (wymaga użycia-0),find (wymaga użycia-print0),grep (potrzebuje-z lub-Z),sort (wymaga użycia-z)). Umieszczenie-0 poxargs rozwiązuje problem, lecz wiele innych narzędzi nie może używać znaku NUL jako separatora, np.head,tail,ls,echo,sed,tar,wc,which.
Ludzie często o tym zapominają i uznają, że xargs jest także zorientowany liniowo[2].
Poniżej zilustrowano problem separatorów:
touch'wazny_plik'touch'mniej wazny_plik'lsmniej*|xargsrmmkdir-p'12" records'ls|xargsrmdir
Wykonanie poleceń spowoduje usunięciewazny_plik i pozostawi katalog12" records oraz plik o nazwiemniej wazny_plik nietknięte.
GNU Parallel jest zorientowanym liniowo odpowiednikiem Xargs, co umożliwia wykonanie powyższych zadań przy jego pomocy[3].
xargs(1) – strona podręcznika systemuLinuxxargs(1): konstruowanie listy argumentów i używanie narzędzia – strona podręcznika systemuFreeBSDxargs(1): konstruowanie listy argumentów i używanie narzędzia – strona podręcznika systemuLinuxxargs(1): konstruowanie listy argumentów i używanie narzędzia – strona podręcznika systemuOpenBSDxargs(1): konstruowanie listy argumentów i wywoływanie narzędzia – strona podręcznika systemuLinux| System plików | |
|---|---|
| Procesy | |
| Środowisko użytkownika | |
| Przetwarzanie tekstu | |
| Wbudowane w powłokę | |
| Komunikacja | |
| Wyszukiwanie | |
| Dokumentacja | |
| Różne |