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

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

/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 
  • zsh: завершение меню для glob
  • Глобальный стек
  • Как настроить zkbd (привязки клавиатуры zsh) на сервере?
  • Мой терминал MacOSX не показывает текущий каталог
  • есть ли способ установить раскраску для вкладки cd?
  • Поиск файлов в ZSH не работает
  • Не устанавливать $? на ненулевое значение на Control + C
  • смотреть случайно упорядоченные видео в одном экземпляре mpv
  • Zsh очистить командную строку от вызова zsh / sched
  • Функция Shell, чтобы проверить, есть ли приостановленный процесс, являющийся дочерним элементом этой оболочки?
  • как создать пользовательскую команду zsh auto_cd
  • Interesting Posts
    Linux и Unix - лучшая ОС в мире.