Как да използвате командата xargs в Linux
Фатмавати Ахмад Заенури/Shutterstock
Трябва да наредите някои команди на Linux заедно, но една от тях не приема подадено въвеждане? |_+_| може да вземе изхода от една команда и да го изпрати на друга команда като параметри.
Всички стандартни помощни програми на Linux имат три потока от данни свързани с тях. Те са стандартният входен поток (stdin), стандартният изходен поток (stdout) и стандартният поток за грешки (stderr).
Тези потоци работят с текст. Изпращаме вход (stdin) към команда, използвайки текст, а отговорът (stdout) се записва в прозореца на терминала като текст. Съобщенията за грешки също се записват в прозореца на терминала като текст (stderr).
Една от страхотните характеристики на Linux и Unix-подобни операционни системи е възможността за прехвърляне на изхода на stdout от една команда към stdin входа на втора команда. Първата команда не се интересува, че нейният изход не отива в терминален прозорец, а втората команда не се интересува, че нейният вход не идва от клавиатура.
Въпреки че всички команди на Linux имат трите стандартни потока, не всички от тях приемат stdout на друга команда като вход към своя stdin. Това означава, че не можете да насочвате вход към тях.
Реклама|_+_| е команда за изграждане на тръбопроводи за изпълнение, използвайки стандартните потоци от данни. С помощта на |_+_| можем да правим команди като |_+_|, |_+_| и |_+_| приема стандартен вход като аргументи.
Командата xargs
|_+_| ще приеме тръбопроводен вход. Може също да приема вход от файл. |_+_| използва този вход като параметри за командите, с които сме му казали да работи. Ако не кажем |_+_| за да работи с конкретна команда, по подразбиране ще използва |_+_|.
Можем да използваме това, за да демонстрираме как |_+_| винаги ще генерира единичен изходен ред, дори от многоредов вход.
Ако използваме |_+_| (избройте по един файл на ред) опция с |_+_|, получаваме a една колона с имена на файлове .
xargs
Това изброява файловете на shell скриптове в текущата директория.
Получаваме една колона, както се очаква. Ако го направим през |_+_| какво получаваме?
xargs
Реклама
Резултатът се записва в прозореца на терминала като един дълъг поток от текст.
Именно тази способност позволява |_+_| захранване на параметри в други команди.
Използване на xargs с wc
Можем да използваме |_+_| лесно да има |_+_| пребройте думи, знаци и редове в множество файлове.
xargs
Ето какво се случва:
- |_+_| изброява *.page файловете и предава списъка на |_+_|.
- |_+_| предава имената на файловете на |_+_|.
- |_+_| третира имената на файловете, сякаш ги е получил като параметри на командния ред.
Статистиката за всеки файл се показва заедно с общата сума.
Използване на xargs с потвърждение
Можем да използваме |_+_| (интерактивна) опция за |_+_| подканете ни за потвърждение, че се радваме да продължи.
Ако предадем низ от имена на файлове на |_+_|, през |_+_|, |_+_| ще създайте файловете за нас.
echo
Реклама
Показва се командата, която ще бъде изпълнена и |_+_| чака да отговорим, като напишете y или Y, или n или N и натиснете Enter.
Ако просто натиснете Enter, се третира като n. Командата се изпълнява само ако напишете y или Y.
Натиснахме y и натиснахме Enter. Можем да използваме |_+_| за да проверите дали файловете са създадени.
rm
Използване на xargs с множество команди
Можем да използваме множество команди с |_+_| с помощта на |_+_| опция (първоначални аргументи).
Тази опция дефинира низ за замяна. Където и токенът за заместващия низ се появи в командния ред, стойностите, които са били предоставени на |_+_| се вмъкват.
Нека използваме |_+_| команда, за да разгледате поддиректориите от текущата директория. |_+_| (директория) опция причинява |_+_| да игнорира файлове и да докладва само за директории.
mkdir
Има една поддиректория, наречена изображения.
РекламаВъв файл, наречен directories.txt, имаме имената на някои директории, които искаме да създадем. Можем да разгледаме съдържанието му с помощта на |_+_|.
xargs
Ще използваме това като входни данни за |_+_|. Командата, която ще изпълним е следната:
xargs
Това се разпада така:
- cat directories.txt | : Това избутва съдържанието на файла directorories.txt (всички нови имена на директории) в |_+_|.
- xargs -I % : Това дефинира заместващ низ с токена %.
- sh-c : Това стартира нова подчерупка. |_+_| (команда) казва на обвивката да чете команди от командния ред.
- ‘ехо %; mkdir %’ : всеки от % символите ще бъде заменен от имената на директории, които се предават от |_+_|. |_+_| командата ще отпечата името на директорията; |_+_| командата ще създаде директорията.
Директориите са изброени една по една.
Можем да използваме |_+_| още веднъж, за да проверите дали директориите са създадени.
xargs
Копиране на файлове на множество места
Можем да използваме |_+_| за да ни позволи да копираме файлове на множество места с една команда.
Ще изпратим имената на две директории в |_+_| като входни параметри. Ще кажем |_+_| да предава само един от тези параметри в даден момент на командата, с която работи.
В този случай командата е |_+_|. Така че ефектът е да извикате |_+_| два пъти, всеки път с една от двете директории като параметър на командния ред. |_+_| параметър, който позволява това да се случи е |_+_| опция (максимален брой). Ще настроим това да бъде едно.
РекламаНие също използваме |_+_| (подробна) опция с |_+_| така че да докладва какво се случва.
echo
Файловете се копират в двете директории, една по една. |_+_| отчита всяко действие за копиране на файл, за да можем да видим как се извършва.
Изтриване на файлове във вложени директории
Ако имената на файлове имат интервали и странни знаци в тях—като знаци за нов ред— |_+_| няма да могат да ги тълкуват правилно. Можем да преодолеем този проблем, като използваме опцията -0 (нулев терминатор). Това казва |_+_| за да използвате нулевия символ като краен разделител за имена на файлове.
Ще използваме |_+_| в този пример. |_+_| има своя собствена опция за справяне с пробелите и странни знаци в имената на файлове. Това е |_+_| (пълно име, нулев знак).
xargs
Това се разпада така:
- намирам . -име *.png : |_+_| ще търси от текущата директория. за обекти с имена, които съответстват на *.png, които са файлове (|_+_|).
- -print0 : имената ще бъдат завършени с нулев знак, а интервалите и странните знаци ще бъдат обслужени.
- xargs -0 : xargs също така ще счита имената на файлове за завършващи с нула и интервалите и странните знаци няма да създават проблеми.
- rm -v -rf {} : rm ще бъде многословен и ще докладва какво се случва (|_+_|). Той ще бъде рекурсивен (-r) и ще преглежда вложени поддиректории и ще премахва файлове без подкана (|_+_|). {} се заменя с всяко име на файл.
Всички поддиректории се търсят и файловете, които съответстват на шаблона за търсене, се изтриват.
Премахване на вложени директории
Да кажем, че искаме да премахнем набор от вложени поддиректории. |_+_| ще ни позволи да ги видим.
-1
ls
Реклама Тази команда ще използва find за рекурсивно търсене в текущата директория. Целта за търсене е директория, наречена level_one. Имената на директориите се предават през |_+_| до |_+_|.
Единствените значителни промени между тази команда и предишната команда са, терминът за търсене е името на най-горната директория и |_+_| казва |_+_| да търси директории, а не файлове.
Името на всяка директория се отпечатва, когато бъде премахната. Можем да проверим с |_+_| :
xargs
Всички вложени поддиректории се изтриват.
Изтриване на всички файлове, с изключение на един тип файл
Можем да използваме |_+_|, |_+_| и |_+_| за да изтриете всички файлове освен един тип, който искаме да запазим. Това е леко противоинтуитивно, но ние предоставяме името на файловия тип, който желаем пазя , а не името на тези, които искаме да изтрием.
|_+_| опцията казва |_+_| за да върнете имената на файловете, които недей съвпадат с модела на търсене. Ние използваме |_+_| (първоначални аргументи) опция с |_+_| още веднъж. Този път символът за заместващ низ, който дефинираме, е {}. Това ще се държи точно по същия начин като маркера за заместващ низ, който генерирахме по-рано, което се оказа %.
xargs
Можем да проверим с |_+_|. Единствените файлове, останали в директорията, са тези, които съответстват на шаблона за търсене *.sh.
xargs
Създаване на архивен файл с Xargs
Можем да използваме |_+_| да търсите файлове и да ги предавате през |_+_| до |_+_|, за да създадете архивен файл.
РекламаЩе търсим в текущата директория. Моделът за търсене е *.page, така че ще търсим .page файлове.
wc
Файловете са изброени според очакванията, тъй като архивният файл е създаден.
Посредникът на данни
Понякога имате нужда от малко скеле, когато подреждате нещата заедно. |_+_| преодолява пропастта между командите, които могат да изпомпват информация и командите, които не са създадени, за да я приемат.
И двете |_+_| и |_+_| има огромен брой опции. Насърчаваме ви да разгледате техните man страници, за да научите повече.
СВЪРЗАНИ: Най-добрите Linux лаптопи за разработчици и ентусиасти
ПРОЧЕТЕТЕ СЛЕДВАЩО- & rsaquo; Как да използвате curl за изтегляне на файлове от командния ред на Linux
- & rsaquo; Как да използвате Pipes в Linux
- › 5 уебсайта, които всеки потребител на Linux трябва да направи отметка
- & rsaquo; Кибер понеделник 2021: Най-добрите технологични сделки
- › Как да намерите своя Spotify Wrapped 2021
- › Функции срещу формули в Microsoft Excel: Каква е разликата?
- › Компютърната папка е 40: Как Xerox Star създаде работния плот
- › Какво представлява MIL-SPEC защита от изпускане?
Дейв Маккей за първи път използва компютри, когато перфорираната хартиена лента беше на мода и оттогава той програмира. След повече от 30 години в ИТ индустрията, той вече е технологичен журналист на пълен работен ден. По време на кариерата си той е работил като програмист на свободна практика, мениджър на международен екип за разработка на софтуер, ръководител на проекти за ИТ услуги и, последно, като служител по защита на данните. Неговото писане е публикувано от howtogeek.com, cloudsavvyit.com, tenterpriser.com и opensource.com. Дейв е евангелист на Linux и привърженик на отворен код.
Прочетете пълната биография