Intereting Posts
Что именно происходит, если входной и выходной файлы совпадают? Сравнение файлов по строкам в awk с разделителем Почему в Gentoo Linux игнорируется –enable-kernel = sys-libs / glibc-2.16? работающее с ванильным ядром с дистрибутивом LTS Использование USB 3-контроллера с Linux 2.6.x ksh loop: "для dir in find .. do" не работает, в отличие от "для dir in ls .. do" Помогите понять команду cut в скрипте CentOS install – выберите существующий раздел как / Почему я не могу перенаправить имя пути с одной команды на «cd»? grep для извлечения подстрок в строке Являются ли ограничения в linux (например, контролируемыми ulimit или /etc/security/limits.conf) для каждого пользователя или для каждого пользователя за процесс? sed удаляет все до и включая первый период, если в этой строке более одного периода, и делайте это для всего файла Как убить процесс, который нельзя убить без перезагрузки? Что делает опция escape-последовательности xterm и как ее включить? Как избежать того, что редактор Geany изменяет владельца файла при его редактировании?

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

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

/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.

Добавьте это в свой конфигурационный файл 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