![在长路径的每个子路径上运行给定的命令](https://linux22.com/image/22566/%E5%9C%A8%E9%95%BF%E8%B7%AF%E5%BE%84%E7%9A%84%E6%AF%8F%E4%B8%AA%E5%AD%90%E8%B7%AF%E5%BE%84%E4%B8%8A%E8%BF%90%E8%A1%8C%E7%BB%99%E5%AE%9A%E7%9A%84%E5%91%BD%E4%BB%A4.png)
假设我有一条很长的路,例如:
/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_cmd
cmd
在你的例子中 {}
替换为找到的目录名称\;
不要忘记它,没有它该命令将无法运行。
示例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