Wielokrotne Xarg z przykładami
- 919
- 97
- Tacjana Karpiński
Jeśli jesteś nowy Xargs
, lub nie wiem co Xargs
Czy jeszcze przeczytaj nasze Xargs dla początkujących z przykładami. Jeśli już jesteś trochę przyzwyczajony Xargs
, i może napisać podstawowy Xargs
Oświadczenia wiersza poleceń bez patrzenia na instrukcję, wówczas ten artykuł pomoże ci stać się bardziej rozwiniętym Xargs
w wierszu poleceń, zwłaszcza poprzez uczynienie go wielokrotnym.
W tym samouczku się nauczysz:
- Jak używać
Xargs
-P (tryb wielokrotny) z wiersza poleceń w Bash - Zaawansowane przykłady użytkowania przy użyciu wielowy
Xargs
z wiersza poleceń w Bash - Głębsze zrozumienie, jak zastosować
Xargs
wieloparte z istniejącym kodem BASH
Zastosowane wymagania i konwencje oprogramowania
Kategoria | Wymagania, konwencje lub wersja oprogramowania |
---|---|
System | Niezależny od rozkładu Linuksa |
Oprogramowanie | Wiersz poleceń Bash, system oparty na Linuksie |
Inny | Xargs Narzędzie jest domyślnie zawarte w skorupce Bash |
Konwencje | # - Wymaga wykonywania Linux -Commands z uprawnieniami root bezpośrednio jako użytkownik root lub za pomocą sudo Komenda$-Wymaga wykonania Linux-commands jako zwykłego niepewnego użytkownika |
Przykład 1: Wywołanie kolejnej powłoki bash ze skompilowanym wejściem
Po tym, jak się uczy się Xargs
, Wkrótce to znajdzie - podczas gdy Xargs
pozwala samo w sobie robić wiele potężnych rzeczy - moc Xargs
wydaje się być ograniczony niezdolnością do wykonania wielu poleceń w sekwencji.
Załóżmy na przykład, że mamy katalog, który ma wymienione podkwaski 00
Do 10
(W sumie 11). I dla każdej z tych substancji, chcemy się w nią przejść i sprawdzić, czy plik wymieniony plik.tekst
istnieje, a jeśli tak kot
(i scal za pomocą >>
) Zawartość tego pliku do pliku total_file.tekst
w katalogu, w którym 00
Do 10
katalogi są. Spróbujmy to zrobić Xargs
w różnych krokach:
$ mkdir 00 01 02 03 04 05 06 07 08 09 10 $ ls 00 01 02 03 04 05 06 07 08 09 10 $ echo „a”> 03/plik/plik.txt $ echo 'b'> 07/plik.txt $ echo 'c'> 10/plik.tekst
Tutaj najpierw tworzymy 11 katalogów, 00
Do 10
a następnie utwórz 3 próbkę plik.tekst
Pliki w subdiarektoriach 03
, 07
I 10
.
$ znajdź . -plik f -name MAXDEPTH 2 -Type.tekst ./10/Plik.tekst ./07/Plik.tekst ./03/Plik.tekst
Następnie piszemy znajdować
polecenie zlokalizowania wszystkich plik.tekst
pliki zaczynające się w bieżącym katalogu (.
) i to maksymalnie 1 poziom podwodników:
$ znajdź . -plik f -name MAXDEPTH 2 -Type.txt | xargs -i cat > ./total_file.txt $ cat total_file.txt c b a
-Maxdepth 2
wskazuje Obecny katalog (1) i Wszystkie podkatalogy tego katalogu (stąd maksymalna głębokość
z 2).
Wreszcie używamy Xargs
(z zalecanym i preferowanym Ciąg zastępczy przekazany do Xargs
-I
Wymień ciąg opcja) w celu uciekania zawartości dowolnego takiego pliku zlokalizowanego przez znajdować
Poleć do pliku w bieżącym wymienionym katalogu total_file.tekst
.
Coś miło jest tu zauważyć, chociaż można by się o tym zastanowić Xargs
jako następnie wykonywanie wielu kot
Polecenia wszystkie przekierowujące do tego samego pliku, można użyć >
(wyjście do nowego pliku, tworzenie pliku, jeśli jeszcze nie istnieje, i zastąpienie dowolnego pliku o tej samej nazwie już tam tam) zamiast >>
(dołącz do pliku i utwórz plik, jeśli jeszcze nie istnieje)!
Dotychczasowe ćwiczenie raczej spełniło nasze wymagania, ale nie pasowało dokładnie do tego wymogu - mianowicie nie przemierza się w podkataliski. Nie używał też >>
przekierowanie zgodnie z określonymi, choć w tym przypadku użycie tego byłoby nadal działane.
Wyzwanie związane z uruchamianiem wielu poleceń (takich jak konkretny płyta CD
polecenie wymagane do zmiany katalogu/przemierzanie podwodności) od wewnątrz Xargs
jest to, że 1) są bardzo trudne do kodowania, a 2) może nie być możliwe w ogóle to kodować.
Istnieje jednak inny i łatwy do zrozumienia sposób, aby to kodować, a gdy wiesz, jak to zrobić, prawdopodobnie będziesz używać tego w obfitości. Zanurzmy się.
$ rm Total_file.tekst
Najpierw wyczyściliśmy nasze poprzednie wyjście.
$ ls -d-color = nigdy [0-9] [0-9] | xargs -i echo 'cd ; Jeśli [-r ./plik.tekst ]; Następnie plik CAT.txt >>… /total_file.tekst; FI 'CD 00; Jeśli [-r ./plik.tekst ]; Następnie plik CAT.txt >>… /total_file.tekst; FI CD 01; Jeśli [-r ./plik.tekst ]; Następnie plik CAT.txt >>… /total_file.tekst; FI CD 02; Jeśli [-r ./plik.tekst ]; Następnie plik CAT.txt >>… /total_file.tekst; FI CD 03; Jeśli [-r ./plik.tekst ]; Następnie plik CAT.txt >>… /total_file.tekst; FI CD 04; Jeśli [-r ./plik.tekst ]; Następnie plik CAT.txt >>… /total_file.tekst; FI CD 05; Jeśli [-r ./plik.tekst ]; Następnie plik CAT.txt >>… /total_file.tekst; FI CD 06; Jeśli [-r ./plik.tekst ]; Następnie plik CAT.txt >>… /total_file.tekst; FI CD 07; Jeśli [-r ./plik.tekst ]; Następnie plik CAT.txt >>… /total_file.tekst; FI CD 08; Jeśli [-r ./plik.tekst ]; Następnie plik CAT.txt >>… /total_file.tekst; FI CD 09; Jeśli [-r ./plik.tekst ]; Następnie plik CAT.txt >>… /total_file.tekst; FI CD 10; Jeśli [-r ./plik.tekst ]; Następnie plik CAT.txt >>… /total_file.tekst; fi
Następnie sformułowaliśmy polecenie, tym razem używając LS
które wymienią wszystkie katalogi odpowiadające [0-9] [0-9]
Wyrażenie regularne (przeczytaj nasz zaawansowany regex Bash z przykładami, aby uzyskać więcej informacji na temat wyrażeń regularnych).
Użyliśmy również Xargs
, Ale tym razem (w porównaniu z poprzednimi przykładami) z Echo
polecenie, które wyświetli dokładnie to, co chcielibyśmy zrobić, nawet jeśli wymaga więcej niż jedno lub wiele poleceń. Pomyśl o tym jak mini-skrypt.
Używamy również płyta CD
zmienić w katalogi wymienione przez ls -d
(tylko katalogi) polecenie (które jako notatka jest chroniona przez --kolor = nigdy
klauzula zapobiegająca kodom kolorów w LS
wyjście z wypaczenia naszych wyników) i sprawdź, czy plik plik.tekst
czy jest w subdiarektorze za pomocą Jeśli [-r…
Komenda. Jeśli istnieje, my kot
plik.tekst
do … /Total_file.tekst
. Zanotuj …
jak płyta CD
w poleceniu umieściło nas w podwodnicy!
Uruchamiamy to, aby zobaczyć, jak to działa (w końcu tylko Echo
jest wykonywany; nic się nie wydarzy). Wygenerowany kod wygląda świetnie. Idźmy teraz o krok dalej i wykonajmy to samo:
$ ls -d-color = nigdy [0-9] [0-9] | xargs -i echo 'cd ; Jeśli [-r ./plik.tekst ]; Następnie plik CAT.txt >>… /total_file.tekst; Fi '| xargs -i bash -c "" $ cat total_file.txt a b c
Teraz wykonaliśmy całkowity skrypt, używając konkretnego (i zawsze takie samo, ja.mi. znajdziesz piszę |. xargs -i bash -c ""
z pewną regularnością) polecenie, które wykonuje wszystko, co zostało wygenerowane przez Echo
poprzedzając to: xargs -i bash -c ""
. Zasadniczo informuje to interpretera Bash, aby wykonał wszystko, co zostało do niego przekazane - i to dla każdego wygenerowanego kodu. Bardzo potężny!
Przykład 2: Xarg z wielokrotnie
Tutaj przyjrzymy się dwóm różnym Xargs
Polecenia, jedno wykonane bez wykonania równolegle (wielokrotnie), drugie z. Rozważ różnicę między następującymi dwoma przykładami:
$ czas na I in $ (seq 1 5); echo $ [$ losowo % 5 + 1]; gotowe | xargs -i echo "sleep ; echo 'gotowe! '"| xargs -i bash -c" "! 5 gotowych! 5 gotowych! 2 gotowe! 4 gotowe! 1 Real 0m17.016S Użytkownik 0M0.017S Sys 0m0.003s
$ czas na I in $ (seq 1 5); echo $ [$ losowo % 5 + 1]; gotowe | xargs -i echo "sleep ; echo 'gotowe! '"| xargs -p5 -i bash -c" "! 1 gotowe! 3 gotowe! 3 gotowe! 3 gotowe! 5 Real 0m5.019S Użytkownik 0M0.036S Sys 0m0.015s
Różnica między faktycznymi dwoma wierszami poleceń jest niewielka; tylko dodaliśmy -P5
w drugim wierszu poleceń. Czas wykonawczy (mierzony przez czas
Prefiks poleceń) jest znaczący. Dowiedzmy się, dlaczego (i dlaczego wyjście różni się!).
W pierwszym przykładzie tworzymy Do
pętla, która będzie działać 5 razy (z powodu subshell $ (seq 1 5)
generowanie liczb z 1
Do 5
) i w nim odzwierciedlamy liczbę losową między 1 a 5. Następnie, w linii z ostatniego przykładu, wysłaliśmy to wyjście do polecenia snu, a także wysyłaliśmy czas spał jako część gotowego! Echo
. Wreszcie wysłaliśmy to do prowadzenia przez komendę bashu Subshell, ponownie w podobny sposób do naszego ostatniego przykładu.
Wyjście pierwszego polecenia działa w ten sposób; Wykonaj sen, wynik wyjściowy, wykonaj następny sen i tak dalej.
Drugie polecenie jednak całkowicie to zmienia. Tutaj dodaliśmy -P5
który w zasadzie uruchamia 5 równoległych wątków jednocześnie!
Sposób, w jaki działa to polecenie, jest: Uruchom do wątków x (zgodnie z definicją opcją -p) i przetwarzaj je jednocześnie. Po zakończeniu wątku złap nowe dane wejściowe, nie czekaj, aż inne wątki zakończą pierwsze. Druga część tego opisu nie ma tutaj zastosowania (byłoby tak, gdyby było mniej wątków określonych przez -P
wówczas liczba „linii” podanego wejścia lub innymi słowy, dostępna byłaby mniej równoległych wątków, a następnie liczba wierszy wejścia).
W rezultacie wątki, które kończą się najpierw - te z krótkim losowym czasem snu - wracają pierwszy i wyprowadzają ich „gotowe!' oświadczenie. Całkowity czas wykonywania spada również z około 17 sekund do około 5 sekund dokładnie w prawdziwym czasie. Fajny!
Wniosek
Za pomocą Xargs
jest jednym z najbardziej zaawansowanych, a także jednym z najpotężniejszych sposobów kodowania w Bash. Ale to nie kończy się na użyciu Xargs
! W tym artykule zbadaliśmy w ten sposób wielowo-strefrową wykonanie równoległe za pośrednictwem -P
opcja Xargs
. Spojrzaliśmy również na dzwonienie podseksów $ ()
i wreszcie wprowadziliśmy metodę przekazywania instrukcji wielu komorowych bezpośrednio Xargs
Za pomocą Bash -C
Wezwanie Subshell.
Potężny? Tak myślimy! Zostaw nam swoje myśli.
Powiązane samouczki Linux:
- Przykłady, jak używać polecenia XARGS w Linux
- Wielokrotyściowe skrypty i zarządzanie procesami w…
- Xargs dla początkujących z przykładami
- Mastering Bash Script Loops
- Jak używać bash subshells w środku, jeśli instrukcje
- Podstawowe polecenia Linux
- Rzeczy do zrobienia po zainstalowaniu Ubuntu 20.04 Focal Fossa Linux
- Polecenia Linux: Top 20 najważniejsze polecenia, które musisz…
- Hung Linux System? Jak uciec do wiersza poleceń i…
- Rzeczy do zainstalowania na Ubuntu 20.04