Выполните заданную команду на каждом подпути длинного пути

Скажем, у меня длинный путь, например:

/a/b/c/d/e/f 

Я хотел бы запустить команду только для каждого из подпутей пути:

например, если моя команда – cmd , я ищу однострочный, который может сделать (возможно, используя однострочный цикл)

 cmd /a cmd /a/b cmd /a/b/c cmd /a/b/c/d cmd /a/b/c/d/e cmd /a/b/c/d/e/f 

Одна из причин, по которой мне это нужно (мне это нужно и для других вещей), заключается в том, что я хотел бы дать кому-то из моей группы unix возможность постепенно увеличивать cd до /a/b/c/d/e/f . Для этого я думаю, что мне нужно запустить chmod g+x на каждом из этих подпапок (не уверен, есть ли альтернатива). Обратите внимание, что я хочу избежать chmod -R g+x /a .

Я работаю в основном на zsh, поэтому я задаюсь вопросом, есть ли что-то, что использует определенные функции zsh.

4 Solutions collect form web for “Выполните заданную команду на каждом подпути длинного пути”

Добавьте это в свой конфигурационный файл zsh :

 function pathargs { local P=$1; local L=${#P}; shift local N=1; while [[ $N -le $L ]]; do [[ ($N == 1 && ${P[1]} = '/') || \ ${P[$N]} != '/' && ($N == $L || ${P[$N+1]} == '/') ]] \ && $@ ${P:0:$N} N=$(($N+1)) done } 

Пример:

 % pathargs /abc/def/ghi/jkl echo / /abc /abc/def /abc/def/ghi /abc/def/ghi/jkl 

Вы можете использовать его с chmod -R g+x вместо echo . Сначала команда будет вызываться в самых верхних каталогах.

Что-то вроде

 path=/a/b/c/d/e/f while test "$path" != "/"; do chmod g+x "$path" path=$(dirname "$path") done 

Быстрый ввод и работа во всех оболочках:

 (while [ "$PWD" != / ]; do cmd .; cd ..; done) 

Скобки сохраняют локальный каталог. Как и ваш пример, корневой каталог опущен. Если вы хотите прекратить работу при неудачном выполнении cmd , добавьте set -e; после открытия круглых скобок.

Как насчет find start_directory -type d -exec my_cmd {} \;

  • start_directory is /a в вашем примере
  • type d указывает только каталоги. type f для файлов. Оставьте этот аргумент как для файлов, так и для каталогов.
  • my_cmd – cmd в вашем примере
  • {} заменяется на найденное имя каталога
  • \; не забывайте, команда не будет работать без него.

Example1 : Это приведет к выписке всех имен каталога полного пути в / home:

 find /home -type d -exec echo {} \; 

Пример2 : Это ваш прецедент:

 find /a -type d -exec echo chmod g+x {} \; 

Он печатает команды, не выполняет их. Вы можете проверить, действительно ли это то, что вы хотите, и если да, вы можете передать его в bash (или zsh, если хотите):

 find /a -type d -exec echo chmod g+x {} \; | bash 
  • При использовании $ hash_array
  • Неограниченная история в zsh
  • Как определить и загрузить свою собственную функцию оболочки в zsh
  • В чем разница между `autoload` и` autoload -U` в Zsh?
  • Присвоение нового значения непосредственно в индекс символа значения в массиве с zsh
  • Получение команды tree для отображения каталогов
  • Функция zsh: достигается максимальный уровень вложенных функций
  • Zsh: dirs в обратном порядке
  • хранить файл с недопустимыми символами
  • Как сделать RPROMPT в самом обновлении zsh при каждом входе?
  • Передача glob-выражений в функции / скрипты
  • Interesting Posts

    Mutt: горячая клавиша для возврата в INBOX?

    Команда, которая может находить файлы, на которые не ссылаются другие файлы, а затем удалять их

    Dotfile не работает в текущей оболочке, нужен новый

    обнаруживать процесс питания процессора без: top, htop, ps?

    динамический компоновщик / загрузчик libs – отсутствует ld.so

    top для веб-браузеров

    Как обрабатывать текст перед тем, как передать его в текст? (Или как мне печатать сообщения Mutt UTF8 в PDF?)

    0403-053 Выражение не завершено; ожидалось больше токенов

    Как установить / сделать разделы раздела ядра 9, которые документируют его функции и структуры данных?

    Установить пакеты локально (без учетной записи root)

    Как удалить визуализацию расширенных атрибутов с моего терминала OSX?

    Установка новой версии приложения в $ HOME без доступа root и подключение к установленному приложению

    См. График текста tcpdump

    export -f в .bashrc после обновления до bash 4.3.30 убивает встроенных?

    странные символы в оболочке bash

    Linux и Unix - лучшая ОС в мире.