在长路径的每个子路径上运行给定的命令

在长路径的每个子路径上运行给定的命令

假设我有一条很长的路,例如:

/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 功能。

答案1

就像是

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

答案2

快速输入并适用于所有 shell:

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

括号将目录更改保留在本地。就像您的示例一样,省略了根目录。如果要在运行cmd失败时停止,请set -e;在左括号后添加。

答案3

将其添加到您的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.该命令将首先在最顶层的目录上调用。

答案4

怎么样find start_directory -type d -exec my_cmd {} \;

  • start_directory/a在您的示例中
  • type d仅表示目录。type f对于文件。为文件和目录保留此参数。
  • my_cmdcmd在你的例子中
  • {}替换为找到的目录名称
  • \;不要忘记它,没有它该命令将无法运行。

示例1:这将打印出/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

相关内容