@Dennis Używam go do różnych rzeczy, często w przygotowaniu z grep, sed, bardzo podstawowym awk itp., Głównie do równoległego wykonywania. find -print0 -name \*.foo -maxdepth 1 | xargs -0 -P4jest o wiele za dużo do pisania w porównaniu z ls *.foo | xargs -P4.
Kornel
Skrypty i funkcje to dwa doskonałe sposoby na ograniczenie pisania.
perl to przesada dla jednego znaku. trjest szybszy zarówno dla procesora, jak i dla twoich palców.
Hello World,
52
GNU xargs (domyślnie w systemie Linux; instalacja findutilsz MacPorts w OS X, aby go uzyskać) obsługuje, -dco pozwala określić niestandardowy ogranicznik dla danych wejściowych, dzięki czemu można to zrobić
Mam alias xxargs="xargs -d '\n'"w swoim bashrc. Więc mogę po prostu robić takie rzeczy:grep -IRl foo | xxargs sed -i s/foo/bar/g
tylerl
4
To naprawdę powinna być zaakceptowana odpowiedź. Nie musisz wyrywać perla. Ale trto też dobry pomysł.
Ehtesh Choudhury,
3
brew install findutilsi gxargswłaśnie tego potrzebowałem na OS X, dzięki.
Brad Koch
5
W przypadku Bash generalnie wolę unikać xargs dla wszystkiego, co najmniej skomplikowane, na rzecz pętli podczas odczytu. W przypadku twojego pytania while read -ar LINE; do ...; donewykonuje zadanie (pamiętaj o stosowaniu składni tablicowej z LINE, np. ${LINE[@]}Dla całej linii). Nie wymaga to żadnych sztuczek: domyślnie read używa tylko \nznaku zakończenia linii.
Powinienem zadać pytanie na temat zalet i wad xargs vs. pętle podczas odczytu ... gotowe!
Może to tylko naśladować xargs -n1 -d'\n', a nie całość xargs.
Hello World,
@HelloWorld - Możesz z łatwością łączyć argumenty, dzięki czemu możesz także symulować xargs -n$Nprzy odrobinie dodatkowego skryptu.
Charles Stewart
Tak, jestem wśród zwycięzców, to tylko uwaga, o której warto wspomnieć.
Hello World,
Właśnie to robię! Dodatkowo możesz użyć readopcji, takich jak czytanie większej liczby słów w osobnych zmiennych lub zmiana ogranicznika za pomocą IFS=' '.
caesarsol
0
Nie ze standardową wersją. Mam zhakowaną wersję, która to robi - korzystałem z niej, zanim dowiedziałem się o ' find ... -print0 | xargs -0 ...'. Skontaktuj się ze mną, jeśli chcesz kopię - zobacz mój profil. (Brak wiedzy o rakietach - ale to po prostu działa. Nie jest to kompletna replika xargs.)
Jeśli filezawiera spacje i znaki nowej linii, wynik tego polecenia uniemożliwi rozróżnienie między nimi, co wydaje się zmierzać w przeciwnym kierunku niż to, o które pyta to pytanie
find -print0 -name \*.foo -maxdepth 1 | xargs -0 -P4
jest o wiele za dużo do pisania w porównaniu zls *.foo | xargs -P4
.Odpowiedzi:
Coś w stylu
powinno działać.
źródło
tr '\n' '\0'
też działa.tr
jest szybszy zarówno dla procesora, jak i dla twoich palców.GNU xargs (domyślnie w systemie Linux; instalacja
findutils
z MacPorts w OS X, aby go uzyskać) obsługuje,-d
co pozwala określić niestandardowy ogranicznik dla danych wejściowych, dzięki czemu można to zrobićźródło
alias xxargs="xargs -d '\n'"
w swoim bashrc. Więc mogę po prostu robić takie rzeczy:grep -IRl foo | xxargs sed -i s/foo/bar/g
tr
to też dobry pomysł.brew install findutils
igxargs
właśnie tego potrzebowałem na OS X, dzięki.W przypadku Bash generalnie wolę unikać xargs dla wszystkiego, co najmniej skomplikowane, na rzecz pętli podczas odczytu. W przypadku twojego pytania
while read -ar LINE; do ...; done
wykonuje zadanie (pamiętaj o stosowaniu składni tablicowej z LINE, np.${LINE[@]}
Dla całej linii). Nie wymaga to żadnych sztuczek: domyślnie read używa tylko\n
znaku zakończenia linii.Powinienem zadać pytanie na temat zalet i wad xargs vs. pętle podczas odczytu ... gotowe!
źródło
xargs -n1 -d'\n'
, a nie całośćxargs
.xargs -n$N
przy odrobinie dodatkowego skryptu.read
opcji, takich jak czytanie większej liczby słów w osobnych zmiennych lub zmiana ogranicznika za pomocąIFS=' '
.Nie ze standardową wersją. Mam zhakowaną wersję, która to robi - korzystałem z niej, zanim dowiedziałem się o '
find ... -print0 | xargs -0 ...
'. Skontaktuj się ze mną, jeśli chcesz kopię - zobacz mój profil. (Brak wiedzy o rakietach - ale to po prostu działa. Nie jest to kompletna replika xargs.)źródło
A co z
cat file | xargs | sed 's/ /\n/ig'
tym zamieni spacje w znaki nowej linii, używając standardowych narzędzi bash dla Linuksa.źródło
file
zawiera spacje i znaki nowej linii, wynik tego polecenia uniemożliwi rozróżnienie między nimi, co wydaje się zmierzać w przeciwnym kierunku niż to, o które pyta to pytanie