Я ищу что-то вроде:
ls | ask_yes_no_for_each_file | chmod +x the_files_approved
Или похожий синтаксис.
Также может работать с другими командами, для которых вы хотите отдельное подтверждение.
источник
Я ищу что-то вроде:
ls | ask_yes_no_for_each_file | chmod +x the_files_approved
Или похожий синтаксис.
Также может работать с другими командами, для которых вы хотите отдельное подтверждение.
Это делает то, что вы ищете:
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-совместимым.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
.Вы можете использовать
xargs
.например:
Опция
-p
: Подскажите пользователю, нужно ли запускать каждую командную строку и читать строку из терминала. Запускайте командную строку только в том случае, если ответ начинается с «y» или «Y».источник
xargs -p
, что я его скопирую.ls
.touch "a very long file name
и нажмите Enter. Посмотрите продолжение строки и просто введите закрывающую кавычку и снова нажмите ввод. Тадаа, новая строка в имени файла. Из-за лени перепечатывать длинное имя файла.