Как да използвате командата `xargs` в Linux: Пълно ръководство
Командата xargs е една от най-мощните и универсални помощни програми, налични в Unix/Linux системите. Тя изгражда и изпълнява команди, като чете аргументи от стандартния вход, ефективно запълвайки пропастта между команди, които произвеждат изход, и команди, които приемат аргументи. Независимо дали управлявате хиляди файлове, автоматизирате повтарящи се задачи в обвивката или изграждате сложни командни конвейери, овладяването на xargs ще подобри значително ефективността ви в терминала.
В това изчерпателно ръководство ще разгледаме как работи xargs вътрешно, ще преминем през практически примери от реалния свят, ще обясним всички основни опции и ще ви покажем как да избегнете често срещани грешки.
Какво е командата xargs и как работи?
По същността си xargs чете елементи от стандартния вход (stdin) — обикновено разделени с интервали или нови редове — и ги предава като аргументи на указана команда. Това е от решаващо значение, тъй като много Unix команди не приемат директно входа от конвейер като аргументи; те очакват аргументи на командния ред. xargs решава този проблем елегантно.
Основният синтаксис е:
command | xargs [options] another_commandНапример, за да намерите всички .txt файлове в текущата директория и да ги изтриете:
find . -name "*.txt" | xargs rmТук find генерира списък с имена на .txt файлове и ги записва в stdout. xargs чете този списък и предава имената на файловете като аргументи на rm, който след това ги изтрива — всичко в една единствена, ефективна операция.
> Защо да не използвате просто rm $(find . -name "*.txt")? Заместването на команди може да се провали или да се държи неочаквано, когато списъкът с аргументи е изключително дълъг или когато имената на файловете съдържат специални символи. xargs се справя и с двата сценария по-безопасно и ефективно.
Основна употреба на xargs
Преди да се потопим в разширени примери, нека установим ясно разбиране на основния модел на извикване.
Предаване на прост списък с аргументи
echo "file1.txt file2.txt file3.txt" | xargs touchТази команда създава три файла — file1.txt, file2.txt и file3.txt — като предава и трите имена като аргументи на touch. Без xargs би трябвало или да въведете всяко име на файл ръчно, или да напишете цикъл.
Проверка на това, което xargs ще изпълни
Преди да изпълните потенциално деструктивна команда, използвайте флага -t, за да отпечатате конструираната команда в stderr преди изпълнението й:
echo "file1.txt file2.txt" | xargs -t rmИзход:
rm file1.txt file2.txtТова е безценно за отстраняване на грешки в конвейери преди да се пристъпи към изпълнение.
Практически примери за използване на xargs
1. Изтриване на файлове, намерени от find
Едно от най-честите и мощни приложения на xargs е комбинирането му с find за изтриване на файлове, отговарящи на определени критерии:
find /var/log -name "*.log" -mtime +30 | xargs rmТова намира всички .log файлове в /var/log, по-стари от 30 дни, и ги изтрива. Този вид автоматизирано почистване е от съществено значение за поддръжката на сървъра — нещо, с което администраторите, управляващи VPS Хостинг или Dedicated сървъри, се занимават редовно, за да поддържат използването на диска под контрол.
2. Ограничаване на броя на аргументите за всяко изпълнение с -n
По подразбиране xargs предава колкото е възможно повече аргументи на командата в едно извикване. Опцията -n ви позволява да контролирате точно колко аргумента се предават при всяко изпълнение:
echo "one two three four five six" | xargs -n 2 echoИзход:
one two
three four
five sixТова е особено полезно, когато дадена команда има ограничение за броя на аргументите, които може да приеме, или когато искате да обработвате елементи на контролирани партиди.
3. Обработка на имена на файлове с интервали и специални символи с -0
Това е една от най-важните практики за безопасност при използване на xargs. Имената на файлове, съдържащи интервали, нови редове или други специални символи, ще нарушат наивните конвейери. Решението е да използвате find с -print0 (което разделя имената на файлове с нулеви байтове вместо с нови редове) и xargs с -0:
find . -name "*.txt" -print0 | xargs -0 rmНулевият байт (
