Як використовувати команду xargs в Linux

| | 0 Comments| 11:41 PM
Categories:

Потрібно об’єднати кілька команд Linux, але одна з них не приймає конвеєрний вхід? xargs може отримати вихід з однієї команди та надіслати його іншій команді як параметри.

Усі стандартні утиліти Linux є три потоки даних пов’язані з ними. Це стандартний вхідний потік (stdin), стандартний вихідний потік (stdout) і стандартний потік помилок (stderr).

Ці потоки працюють з текстом. Ми надсилаємо введення (stdin) до команди за допомогою тексту, а відповідь (stdout) записується у вікно терміналу як текст. Повідомлення про помилки також записуються у вікно терміналу у вигляді тексту (stderr).

Однією з чудових особливостей операційних систем Linux і Unix-подібних є можливість передавати вихідний вихід stdout з однієї команди на вхід stdin другої команди. Першій команді байдуже, що її вихід не надходить у вікно терміналу, а другій команді байдуже, що її введення надходить не з клавіатури.

Хоча всі команди Linux мають три стандартні потоки, не всі вони приймають стандартний вихід іншої команди як вхід до свого стандартного коду. Це означає, що ви не можете передавати вхідні дані до них.

xargs — це команда для побудови конвеєрів виконання за допомогою стандартних потоків даних. Використовуючи xargs, ми можемо змусити такі команди, як echo, rm і mkdir приймати стандартний вхід як аргументи.

Команда xargs

xargs прийматиме конвейерний вхід. Він також може приймати введення з файлу. xargs використовує цей вхід як параметри для команд, з якими ми вказали йому працювати. Якщо ми не вказуємо xargs працювати з певною командою, він за замовчуванням використовуватиме echo.

Ми можемо використовувати це, щоб продемонструвати, як xargs завжди генеруватиме один рядок виводу, навіть з багаторядкового введення.

Якщо ми використовуємо параметр -1 (список по одному файлу на рядок) з ls, ми отримаємо a один стовпець імен файлів.

ls -1 ./*.sh

Тут відображаються файли сценарію оболонки в поточному каталозі.

Ми отримуємо один стовпець, як і очікувалося. Якщо ми переведемо це через xargs, що ми отримаємо?

ls -1 ./*.sh | xargs

Результат записується у вікно терміналу як один довгий потік тексту.

  Як грати в Splitgate (бета-версія) на Linux

Саме ця можливість дозволяє xargs передавати параметри в інші команди.

Використання xargs з wc

Ми можемо використовувати xargs, щоб легко запропонувати wc підрахувати слова, символи та рядки у кількох файлах.

ls *.page | xargs wc

Ось що відбувається:

ls перераховує файли *.page і передає список у xargs.
xargs передає імена файлів у wc.
wc розглядає імена файлів так, ніби він отримав їх як параметри командного рядка.

Статистичні дані для кожного файлу відображаються разом із загальною сумою.

Використання xargs з підтвердженням

Ми можемо використовувати параметр -p (інтерактивний), щоб xargs запропонував нам підтвердити, що ми раді продовжити.

Якщо ми передаємо рядок імен файлів для дотику, через 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.

Давайте скористаємося командою дерева, щоб переглянути підкаталоги з поточного каталогу. Параметр -d (каталог) змушує дерево ігнорувати файли та звітувати лише про каталоги.

tree -d

Існує один підкаталог під назвою «images».

У файлі під назвою “directories.txt” ми маємо назви деяких каталогів, які ми хочемо створити. Ми можемо подивитися на його вміст за допомогою cat.

cat directories.txt

Ми збираємося використовувати це як вхідні дані для xargs. Команда, яку ми збираємося виконати, така:

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

Це розкладається так:

cat directories.txt |: Це переміщує вміст файлу directorories.txt (всі нові імена каталогів) у xargs.
xargs -I %: Це визначає «рядок заміни» маркером «%».
sh -c: Це запускає нову підоболонку. -c (команда) повідомляє оболонки читати команди з командного рядка.
‘echo %; mkdir %’: кожен із токенів «%» буде замінено іменами каталогів, які передаються xargs. Команда echo надрукує назву каталогу; команда mkdir створить каталог.

  Як використовувати команду man в Linux: приховані секрети та основи

Каталоги перераховуються один за іншим.

Ми можемо використовувати дерево ще раз, щоб перевірити, чи були створені каталоги.

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 "{}"

Це розкладається так:

знайти . -name “*.png”: find збирається шукати з поточного каталогу “.” для об’єктів з іменами, які відповідають «*.png», які є файлами (тип -f).
-print0: імена будуть закінчуватися нульовим символом, а пробіли та дивні символи будуть обслуговуватися.
xargs -0: xargs також вважатиме, що імена файлів закінчуються нулем, і пробіли та дивні символи не створять проблем.
rm -v -rf “{}”: rm буде докладним і повідомлятиме про те, що відбувається (-v). Він буде рекурсивним (-r), переглядати вкладені підкаталоги, а також видалятиме файли без запиту (-f). «{}» замінюється кожною назвою файлу.

  Як налаштувати ігрові периферійні пристрої Razer на Linux за допомогою Polychromatic

знайти .  - ім'я

Шукаються всі підкаталоги, а файли, які відповідають шаблону пошуку, видаляються.

Видалення вкладених каталогів

Скажімо, ми хочемо видалити набір вкладених підкаталогів. дерево дозволить нам їх побачити.

tree -d

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

Ця команда використовуватиме find для рекурсивного пошуку в поточному каталозі. Метою пошуку є каталог під назвою «level_one». Імена каталогів передаються через xargs до rm.

знайти .  - ім'я

Єдині суттєві зміни між цією командою та попередньою командою: пошуковий термін — це назва найвищого каталогу, а -type d вказує find шукати каталоги, а не файли.

Ім’я кожного каталогу друкується під час його видалення. Ми можемо перевірити за допомогою дерева:

tree -d

Усі вкладені підкаталоги видаляються.

Видалення всіх файлів, крім одного типу файлів

Ми можемо використовувати find, xargs і rm, щоб видалити всі файли, крім одного типу, який ми хочемо зберегти. Це трохи нерозумно, але ми вказуємо назву типу файлу, який хочемо зберегти, а не назву тих, які ми хочемо видалити.

Параметр -not вказує find повернути імена файлів, які не відповідають шаблону пошуку. Ми знову використовуємо параметр -I (початкові аргументи) з xargs. Цього разу маркером заміни рядка, який ми визначаємо, є «{}». Це буде вести себе точно так само, як маркер заміни рядка, який ми згенерували раніше, який був «%».

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

знайти .  -type f -not - ім'я

Ми можемо перевірити за допомогою 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 мають величезну кількість варіантів. Щоб дізнатися більше, вам рекомендується переглянути їхні сторінки керівництва.