Чи є команда одного рядка, щоб зробити chmod інтерактивним?


24

Я шукаю щось на зразок:

ls | ask_yes_no_for_each_file | chmod +x the_files_approved

Або подібний синтаксис.

Також може працювати над іншими командами, для яких потрібно індивідуальне підтвердження.

Відповіді:


45

Це робить те, що ви шукаєте:

find . -maxdepth 1 -type f -print0 | xargs -L1 -p0 chmod +x

Це використовується findскоріше, ніж lsтому, що, як правило, аналіз lsрезультатів аналізу недостовірний . Ця форма, використовуючи find, однак, буде працювати з іменами, навіть якщо вони містять нові рядки або інші складні символи.

Пояснення

  • find . -maxdepth 1 -type f -print0

    Це вибирає файли. Це можна налаштувати за допомогою будь-якого з багатьох варіантів пошуку. Опція print0повідомляє findпро друк імен файлів у списку, розділеному нулем. Це єдиний надійний для передачі списки імен файлів.

  • xargs -L1 -p0 chmod +x

    Це займає розділений нулем список імен файлів, згенерованих findі застосовує до них вашу команду.

Цей -L1параметр повідомляє, що xargsможна працювати лише над одним ім'ям файлу одночасно. -pПараметр вказує xargsна запит на твердження , перш ніж продовжити. -0Опція вказує xargsвикористовувати нульовий символ в якості роздільника між іменами файлів.

[Мені не було відомо про -pваріант, xargsпоки @kwan не вказав на це.]


Ви можете зробити findкоманду POSIX сумісною за допомогою -exec printf '%s\0' {} +. Не думайте, що існує якийсь спосіб зробити всю POSIX сумісною.
l0b0

Цей синтаксис дає мені попередження , find: warning: you have specified the -maxdepth option after a non-option argument -type, but options are not positional (-maxdepth affects tests specified before it as well as those specified after it). Please specify options before other arguments.так що працює з -maxdepth 1до -type f, як: find . -maxdepth 1 -type f -print0 | xargs -L1 -p0 chmod +x.
Харві

@Harvey Ви маєте рацію: я оновив відповідь, щоб видалити це попередження.
John1024,

25

Можна використовувати xargs.

наприклад:

ls|xargs -I path -p chmod +x path

Варіант -p: Попросіть користувача про те, чи потрібно запускати кожен командний рядок і читати рядок з терміналу. Запускайте командний рядок лише у тому випадку, якщо відповідь починається з 'у' або 'Y'.


1
+1 Мені так подобається ваше використання, xargs -pщо я скопіюю його.
John1024

1
Ідеально! І дуже простий спосіб зробити більшість будь-яких команд інтерактивними. Спасибі.
Харві


@Kroltan - навіщо хтось використовувати новий рядок у назві файлу?
nbubis

1
@nbubis Це може статися: перейдіть до терміналу і наберіть touch "a very long file nameі натисніть клавішу Enter. Дивіться продовження рядка та просто введіть кінцеву пропозицію та натисніть клавішу enter ще раз. тада, новий рядок у назві файлу. З ліні вводити довге ім’я файлу.
Кролтан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.