Movatterモバイル変換


[0]ホーム

URL:


Przejdź do zawartości
Wikipediawolna encyklopedia
Szukaj

xargs

Z Wikipedii, wolnej encyklopedii

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-0rm

W 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.

Przykłady

[edytuj |edytuj kod]
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.

Problem separatorów

[edytuj |edytuj kod]

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].

Przypisy

[edytuj |edytuj kod]
  1. GNU Core Utilities FAQ
  2. Wyniki wyszukiwania google ukazujące jak wielu ludzi zapomina o -0
  3. http://www.gnu.org/software/parallel/

Linki zewnętrzne

[edytuj |edytuj kod]
Polecenia systemów operacyjnych Unix
System plików
Procesy
Środowisko użytkownika
Przetwarzanie tekstu
Wbudowane w powłokę
Komunikacja
Wyszukiwanie
Dokumentacja
Różne
Źródło: „https://pl.wikipedia.org/w/index.php?title=Xargs&oldid=73998672
Kategoria:

[8]ページ先頭

©2009-2026 Movatter.jp