Есть ли однострочная команда, чтобы сделать 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 не указал на это.]

John1024
источник
Вы можете сделать findкоманду POSIX совместимой, используя -exec printf '%s\0' {} +. Не думайте, что есть какой-нибудь способ сделать все это POSIX-совместимым.
10
Этот синтаксис дает мне предупреждение , 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.
Харви
@ Харви Вы правы: я обновил ответ, чтобы убрать это предупреждение.
John1024
25

Вы можете использовать xargs.

например:

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

Опция -p: Подскажите пользователю, нужно ли запускать каждую командную строку и читать строку из терминала. Запускайте командную строку только в том случае, если ответ начинается с «y» или «Y».

Kwan
источник
1
+1 Мне так нравится твое использование xargs -p, что я его скопирую.
John1024
1
Отлично! И очень простой способ сделать любую команду интерактивной. Благодарю.
Харви
21
Не разобрать ls.
Кролтан
@ Kroltan - почему кто-то использовал бы новую строку в имени файла?
Нбубис
1
@nbubis Это может произойти: перейдите к терминалу и введите touch "a very long file nameи нажмите Enter. Посмотрите продолжение строки и просто введите закрывающую кавычку и снова нажмите ввод. Тадаа, новая строка в имени файла. Из-за лени перепечатывать длинное имя файла.
Kroltan