我有几个项目必须使用相同的命令。项目总是在
/home/[username]/public_html/[prjectname]/
我想从项目的每个目录运行此命令,因此我需要知道我的项目库。我尝试过${path:0:20}
,但由于用户和项目名称的字符串长度不同。我只需要知道路径的前四个部分。
答案1
你已经提到了cut
。您只需将分隔符设置为/
。有点不直观的部分是您需要字段 1-5,因为第一个字段之前的部分/
也被算作(空)字段。
echo /1/2/3/4/5/6/7 | cut -d/ -f1-5
结果是
/1/2/3/4
答案2
在zsh
shell 中, if $var
is /1/2/3/4/5/6
、${var:h1}
is /
、${var:h2}
is /1
、${var:h3}
is/1/2
等等(h
对于头csh
,与/相同vim
;而数字后缀是zsh
扩展名)
所以在这里,要离开/home/user/public_html/projectX
,file=/home/user/public_html/projectX/a/b
那就是
dir=${file:h5}
要循环遍历所有匹配的目录/home/*/public_html/*
,那就是:
for dir in /home/*/public_html/*(N/); do
something with $dir
done
(替换(N/)
为(N-/)
还包括目录的符号链接;在任何情况下,第一个*
也将匹配上面目录的符号链接)。
这(N/)
是一个全局限定符,特定于 的功能zsh
。
答案3
您可能需要考虑(双)“参数扩展:删除匹配的前缀/后缀模式”:
$ path=/home/[username]/public_html/[prjectname]/abc/xyz
$ echo "${path%"${path#/*/*/*/*/}"}"
/home/[username]/public_html/[prjectname]/
无需外部命令。
答案4
尝试这个,
find /path/to/dir -mindepth 4 -type d | cut -d"/" -f -5 | sort -u
type -d
将仅打印目录。mindepth
将打印至少有 4 个子目录的目录。-d"/"
用作/
分隔符来剪切-f -5
删除第五列中的所有内容sort -u
将打印排序的唯一文件夹路径。