Ответы:
Это делает то, что вы ищете:
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: 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.
например:
ls|xargs -I path -p chmod +x path
Опция -p: Подскажите пользователю, нужно ли запускать каждую командную строку и читать строку из терминала. Запускайте командную строку только в том случае, если ответ начинается с «y» или «Y».
xargs -p, что я его скопирую.
touch "a very long file nameи нажмите Enter. Посмотрите продолжение строки и просто введите закрывающую кавычку и снова нажмите ввод. Тадаа, новая строка в имени файла. Из-за лени перепечатывать длинное имя файла.
findкоманду POSIX совместимой, используя-exec printf '%s\0' {} +. Не думайте, что есть какой-нибудь способ сделать все это POSIX-совместимым.