将路径剪切到前四个目录

将路径剪切到前四个目录

我有几个项目必须使用相同的命令。项目总是在

/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

zshshell 中, if $varis /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/projectXfile=/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将打印排序的唯一文件夹路径。

相关内容