24

Я ищу что-то вроде:

ls | ask_yes_no_for_each_file | chmod +x the_files_approved

Или похожий синтаксис.

Также может работать с другими командами, для которых вы хотите индивидуальное подтверждение.

2 ответа2

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 не указал на это.]

25

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

например:

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .