Трябва да свържете няколко 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
Това изброява файловете със скрипт на обвивката в текущата директория.
Получаваме една колона според очакванията. Ако го прокараме xargs
какво получаваме?
ls -1 ./*.sh | xargs
Изходът се записва в прозореца на терминала като един дълъг поток текст.
Това е тази способност, която нека xargs
подаване на параметри в други команди.
Използване на xargs С wc
Можем да използваме xargs
лесно да има wc
пребройте думите, знаците и редовете в множество файлове.
ls *.page | xargs wc
Това се случва:
ls
изброява * .page файловете и предава списъка наxargs
.xargs
предава имената на файловете доwc
.wc
третира имената на файлове, сякаш ги е получил като параметри на командния ред.
Статистиката за всеки файл се показва заедно с обща сума.
Използване на xargs с потвърждение
Можем да използваме -p
(интерактивна) опция да има xargs
подканете ни за потвърждение, че сме щастливи за това да продължи.
Ако предаваме низ от имена на файлове към touch
, през xargs
, touch
ще създаде файловете за нас.
echo 'one two three' | xargs -p touch
Командата, която ще се изпълни, се показва и xargs
чака да отговорим, като напишете „y“ или „Y“, или „n“ или „N“, и натиснете Enter.
Ако просто натиснете Enter, това се третира като „n“. Командата се изпълнява само ако въведете "y" или "Y".
Натиснахме „y“ и натиснахме Enter. Можем да използваме ls
за да проверите дали файловете са създадени.
ls one two three
Използване на xargs с множество команди
Можем да използваме няколко команди с xargs
чрез използване на -I
(първоначални аргументи) опция.
Тази опция определя „заменителен низ.“ Където и маркерът за заместващия низ да се появи в командния ред, стойностите, които са били предоставени на xargs
се вмъкват.
Нека използваме tree
команда за разглеждане на поддиректориите от текущата директория. Най- -d
(директория) опция причини tree
да игнорира файлове и да докладва само за директории.
tree -d
Има един поддиректория, наречена „изображения“.
Във файл, наречен „directories.txt“, имаме имената на някои директории, които желаем да сме създали. Можем да разгледаме съдържанието му, използвайки cat
.
cat directories.txt
Ще използваме това като входни данни за xargs
, Командата, която ще направим, е тази:
cat directories.txt | xargs -I % sh -c 'echo %; mkdir %'
Това се разгражда така:
- котешки директории.txt |: Това избутва в съдържанието на файла directrories.txt (всички нови имена на директория)
xargs
. - xargs -I%: Това дефинира „заместващ низ“ с маркера „%“.
- ш -с: С това се стартира нова подплатка. Най-
-c
(команда) казва на черупката да чете команди от командния ред. - 'Ехо%; mkdir% ’: всеки от символите „%“ ще бъде заменен от имената на директория, които са преминали
xargs
, Най-echo
командата ще отпечата името на директорията; наmkdir
командата ще създаде директорията.
Директориите са изброени една по една.
Можем да използваме tree
още веднъж за проверка на директории са създадени.
tree -d
Копиране на файлове в няколко места
Можем да използваме xargs
за да ни позволи да копираме файлове на няколко места с една команда.
Ще въведем имената на две директории xargs
като входни параметри. Ще кажем xargs
да предава само един от тези параметри наведнъж на командата, с която работи.
В този случай командата е cp
, Така че ефектът е да се обадите cp
два пъти, всеки път с една от двете директории като параметър на командния ред. Най- xargs
параметър, който позволява това да се случи, е -n
(максимален брой) опция. Ще настроим това да бъде едно.
Ние също използваме -v
(многословен) вариант с cp
така че да отчита какво се случва.
echo ~/Backups/ ~/Documents/page-files/ | xargs -n 1 cp -v ./*.page
Файловете се копират в двете директории, по една директория в даден момент. 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
). "{}" Се заменя с всяко име на файл.
Всички поддиректории се търсят и файловете, които съответстват на модела на търсене, се изтриват.
Премахване на вложени директории
Да речем, че искаме да премахнем набор от вложени поддиректории. tree
ще ни позволим да ги видим.
tree -d
find . -name "level_one" -type d printo | xargs -o rm -v -rf "{}"
Тази команда ще използва find за търсене рекурсивно в текущата директория. Целта за търсене е директория, наречена „level_one“. Имената на директорията се предават xargs
да се rm
.
Единствените съществени промени между тази команда и предишната команда са, думата за търсене е името на най-горната директория и -type d
разказва find
да търсите директории, а не файлове.
Името на всяка директория се отпечатва, докато е премахната. Можем да проверим с tree
:
tree -d
Всички вложени поддиректории се изтриват.
Изтриване на всички файлове, с изключение на един тип файл
Можем да използваме find
, xargs
и rm
да изтрием всички файлове освен един тип, който искаме да запазим. Това е леко противоположно, но ние предоставяме името на файлове, който желаем пазя, а не името на тези, които искаме да изтрием.
Най- -not
опция казва find
за да върнете имената на файловете, които не съвпадат с модела на търсене. Ние използваме -I
(първоначални аргументи) опция с xargs
още веднъж. Този път маркерът за заместване на низ, който определяме, е „{}”. Това ще се държи точно както токенът за заместване на низ, който генерирахме по-рано, което се оказа „%“.
find . -type f -not - name "*.sh" -print0 | xargs -0 -I {} rm -v {}
Можем да проверим с ls
, Единствените файлове, останали в директорията, са тези, които съответстват на модела на търсене „* .sh“.
ls -l
Създаване на архивен файл с Xargs
Можем да използваме find
да търсите файлове и да ги предавате xargs
да се tar
, за да създадете архивен файл.
Ще търсим в текущата директория. Моделът за търсене е „* .page“, така че ще търсим файлове „.page“.
find ./ - name "*.page" -type f -print0 | xargs -0 -tar -cvzf page_files.tar.gz
Файловете са изброени според очакванията, тъй като архивният файл е създаден.
Медиаторът на данни
Понякога се нуждаете от малко скеле, когато подреждате нещата заедно. xargs
преодолява пропастта между команди, които могат да изпомпват информация, и команди, които не са създадени, за да я приемат.
И двете xargs
и find
имат огромен брой опции. Насърчаваме ви да проверите техните мъжки страници, за да научите повече.