/ Как да използвате командата xargs на Linux

Как да използвате командата xargs в Linux

Подкана за терминал на Linux на лаптоп

Трябва да свържете няколко Linux команди заедно, но една от тях не приема пипета? xargs може да вземе изхода от една команда и да я изпрати на друга команда като параметри.

Всички стандартни помощни програми за Linux имат трипотоци от данни, свързани с тях. Те са стандартният входен поток (stdin), стандартният изходен поток (stdout) и стандартният поток на грешки (stderr).

Тези потоци работят с текст. Изпращаме вход (stdin) на команда, използвайки текст, а отговорът (stdout) се записва в прозореца на терминала като текст. Съобщенията за грешки също се записват в прозореца на терминала като текст (stderr).

Една от страхотните характеристики на Linux и Unix-подобниоперационните системи е способността да извеждате изходния код от една команда във входа stdin на втора команда. Първата команда не се интересува от това, че нейният изход няма да отиде в терминален прозорец, а втората команда не се интересува дали въвеждането му не идва от клавиатура.

Въпреки че всички команди на Linux имат трите стандартни потока, не всички приемат stdout на друга команда като вход към stdin. Това означава, че не можете да въведете тръба към тях.

xargs е команда за изграждане на тръбопроводи за изпълнение, използвайки стандартните потоци данни. Като се използва xargs можем да правим команди като echo, rm, и mkdir приемете стандартните данни като аргументи.

Командата xargs

xargs ще приеме тръбен вход. Той може също да приеме вход от файл. xargs използва този вход като параметри за командите, с които сме му казали да работи. Ако не разкажем xargs да работи с конкретна команда, която по подразбиране ще използва echo.

Можем да използваме това, за да демонстрираме как xargs винаги ще генерира един ред на изхода, дори и от многоредово въвеждане.

Ако използваме -1 (списък на един файл на ред) опция с ls, получаваме една колона с имена на файлове.

ls -1 ./*.sh

v в терминален прозорец

Това изброява файловете със скрипт на обвивката в текущата директория.

изход на ls в терминален прозорец

Получаваме една колона според очакванията. Ако го прокараме xargs какво получаваме?

ls -1 ./*.sh | xargs

ls -1 ./*.sh | xargs в прозорец на терминала

Изходът се записва в прозореца на терминала като един дълъг поток текст.

Провежда се през xargs в терминален прозорец

Това е тази способност, която нека xargs подаване на параметри в други команди.

Използване на xargs С wc

Можем да използваме xargs лесно да има wc пребройте думите, знаците и редовете в множество файлове.

ls *.page | xargs wc

ls * .page | xargs wc в терминален прозорец

Това се случва:

  • ls изброява * .page файловете и предава списъка на xargs.
  • xargs предава имената на файловете до wc.
  • wc третира имената на файлове, сякаш ги е получил като параметри на командния ред.

wc изход в терминален прозорец

Статистиката за всеки файл се показва заедно с обща сума.

Използване на xargs с потвърждение

Можем да използваме -p (интерактивна) опция да има xargs подканете ни за потвърждение, че сме щастливи за това да продължи.

Ако предаваме низ от имена на файлове към touch, през xargs, touch ще създаде файловете за нас.

echo 'one two three' | xargs -p touch

ехо 'едно две три' | xargs -p докоснете в терминален прозорец

Командата, която ще се изпълни, се показва и xargs чака да отговорим, като напишете „y“ или „Y“, или „n“ или „N“, и натиснете Enter.

Ако просто натиснете Enter, това се третира като „n“. Командата се изпълнява само ако въведете "y" или "Y".

xargs подканва за потвърждение в терминален прозорец

Натиснахме „y“ и натиснахме Enter. Можем да използваме ls за да проверите дали файловете са създадени.

ls one two three

изход на ls в терминален прозорец

Използване на xargs с множество команди

Можем да използваме няколко команди с xargs чрез използване на -I (първоначални аргументи) опция.

Тази опция определя „заменителен низ.“ Където и маркерът за заместващия низ да се появи в командния ред, стойностите, които са били предоставени на xargs се вмъкват.

Нека използваме tree команда за разглеждане на поддиректориите от текущата директория. Най- -d (директория) опция причини tree да игнорира файлове и да докладва само за директории.

tree -d

дърво -d в терминален прозорец

Има един поддиректория, наречена „изображения“.

Във файл, наречен „directories.txt“, имаме имената на някои директории, които желаем да сме създали. Можем да разгледаме съдържанието му, използвайки cat.

cat directories.txt

cat directories.txt в терминален прозорец

Ще използваме това като входни данни за xargs, Командата, която ще направим, е тази:

cat directories.txt | xargs -I % sh -c 'echo %; mkdir %'

Това се разгражда така:

  • котешки директории.txt |: Това избутва в съдържанието на файла directrories.txt (всички нови имена на директория) xargs.
  • xargs -I%: Това дефинира „заместващ низ“ с маркера „%“.
  • ш -с: С това се стартира нова подплатка. Най- -c (команда) казва на черупката да чете команди от командния ред.
  • 'Ехо%; mkdir% ’: всеки от символите „%“ ще бъде заменен от имената на директория, които са преминали xargs, Най- echo командата ще отпечата името на директорията; на mkdir командата ще създаде директорията.

котешки директории.txt | xargs -I% sh -c 'ехо%; mkdir% 'в прозорец на терминала

Директориите са изброени една по една.

изход на xargs в терминален прозорец

Можем да използваме tree още веднъж за проверка на директории са създадени.

tree -d

изход от дърво в терминален прозорец

Копиране на файлове в няколко места

Можем да използваме xargs за да ни позволи да копираме файлове на няколко места с една команда.

Ще въведем имената на две директории xargs като входни параметри. Ще кажем xargs да предава само един от тези параметри наведнъж на командата, с която работи.

В този случай командата е cp, Така че ефектът е да се обадите cp два пъти, всеки път с една от двете директории като параметър на командния ред. Най- xargs параметър, който позволява това да се случи, е -n (максимален брой) опция. Ще настроим това да бъде едно.

Ние също използваме -v (многословен) вариант с cp така че да отчита какво се случва.

echo ~/Backups/ ~/Documents/page-files/ | xargs -n 1 cp -v ./*.page

echo ~ / Резервни копия / ~ / Документи / страници-файлове / | xargs -n 1 cp -v ./*.page в терминален прозорец

Файловете се копират в двете директории, по една директория в даден момент. cp отчита всяко действие за копиране на файл, така че да можем да видим как се извършват.

изход на xargs и cp в терминален прозорец

Изтриване на файлове в вложени директории

Ако имената на файлове имат интервали и странни символи в тях - например символи в нов ред - xargs няма да може да ги интерпретира правилно. Можем да преодолеем проблема с помощта на опцията -0 (нулев терминатор). Това разказва xargs за да използвате нулевия символ като краен разделител за имена на файлове.

Ще използваме find в този пример. find има своя опция за справяне с бялото пространство и непознати символи във имена на файлове. Това е -print0 (пълно име, нулев знак) опция.

find . -name "*.png" -type f -print0 | xargs -0 rm -v -rf "{}"

Това се разгражда така:

  • намирам . -име „* .png“: find ще търси от текущата директория „.“ за обекти с имена, които съответстват на „* .png“, които са файлове (type -f).
  • -print0: имената ще бъдат прекратени с нулев символ, а интервалите и странните символи ще бъдат обслужвани.
  • xargs -0: xargs също ще смята имената на файловете за недействителни и интервалите и странните символи няма да създадат проблеми.
  • rm -v -rf “{}”: rm ще бъде многословен и докладва какво се случва (-v). Той ще бъде рекурсивен (-r) и ще преглежда през вложени поддиректории и ще премахва файлове без подкана (-f). "{}" Се заменя с всяко име на файл.

намирам . -name "* .png" -тип f -print0 | xargs -0 rm -v -rf "{}" в терминален прозорец

Всички поддиректории се търсят и файловете, които съответстват на модела на търсене, се изтриват.

Изход на rm в терминален прозорец

Премахване на вложени директории

Да речем, че искаме да премахнем набор от вложени поддиректории. tree ще ни позволим да ги видим.

tree -d

дърво -d в терминален прозорец

find . -name "level_one" -type d printo | xargs -o rm -v -rf "{}"

Тази команда ще използва find за търсене рекурсивно в текущата директория. Целта за търсене е директория, наречена „level_one“. Имената на директорията се предават xargs да се rm.

намирам . -name "level_one" -тип d printo | xargs -o rm -v -rf "{}" в терминален прозорец

Единствените съществени промени между тази команда и предишната команда са, думата за търсене е името на най-горната директория и -type d разказва find да търсите директории, а не файлове.

изход от find и xargs и rm в терминален прозорец

Името на всяка директория се отпечатва, докато е премахната. Можем да проверим с tree :

tree -d

дърво -d в терминален прозорец

Всички вложени поддиректории се изтриват.

Изтриване на всички файлове, с изключение на един тип файл

Можем да използваме find, xargs и rm да изтрием всички файлове освен един тип, който искаме да запазим. Това е леко противоположно, но ние предоставяме името на файлове, който желаем пазя, а не името на тези, които искаме да изтрием.

Най- -not опция казва find за да върнете имената на файловете, които не съвпадат с модела на търсене. Ние използваме -I (първоначални аргументи) опция с xargs още веднъж. Този път маркерът за заместване на низ, който определяме, е „{}”. Това ще се държи точно както токенът за заместване на низ, който генерирахме по-рано, което се оказа „%“.

find . -type f -not - name "*.sh" -print0 | xargs -0 -I {} rm -v {}

намирам . -тип f -not - име "* .sh" -print0 | xargs -0 -I {} rm -v {} в терминален прозорец

Можем да проверим с ls, Единствените файлове, останали в директорията, са тези, които съответстват на модела на търсене „* .sh“.

ls -l

изход от ls в терминален прозорец

Създаване на архивен файл с Xargs

Можем да използваме find да търсите файлове и да ги предавате xargs да се tar, за да създадете архивен файл.

Ще търсим в текущата директория. Моделът за търсене е „* .page“, така че ще търсим файлове „.page“.

find ./ - name "*.page" -type f -print0 | xargs -0 -tar -cvzf page_files.tar.gz

намери ./ - име "* .page" -тип f -print0 | xargs -0 -tar -cvzf page_files.tar.gz в терминален прозорец

Файловете са изброени според очакванията, тъй като архивният файл е създаден.

извеждане на катран в терминален прозорец

Медиаторът на данни

Понякога се нуждаете от малко скеле, когато подреждате нещата заедно. xargs преодолява пропастта между команди, които могат да изпомпват информация, и команди, които не са създадени, за да я приемат.

И двете xargs и find имат огромен брой опции. Насърчаваме ви да проверите техните мъжки страници, за да научите повече.