Wielokrotne Xarg z przykładami

Wielokrotne Xarg z przykładami

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
Wielokrotne Xarg z przykładami

Zastosowane wymagania i konwencje oprogramowania

Wymagania oprogramowania i konwencje linii poleceń Linux
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