Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 通过目录路径向上搜索以查找特定目录_Bash_Unix_Command Line_Terminal - Fatal编程技术网

Bash 通过目录路径向上搜索以查找特定目录

Bash 通过目录路径向上搜索以查找特定目录,bash,unix,command-line,terminal,Bash,Unix,Command Line,Terminal,我知道如何在层次结构下递归搜索文件或目录,但不知道如何在层次结构上搜索并找到特定的目录 给定路径和文件,例如这些家伙: /Users/username/projects/project\u name/lib/sub\u dir/file.rb /Users/username/projects/project_name/lib/sub_dir/2nd_sub_dir/3rd_sub_dir/file.rb /Users/username/projects/project\u name/spec/s

我知道如何在层次结构下递归搜索文件或目录,但不知道如何在层次结构上搜索并找到特定的目录

给定路径和文件,例如这些家伙:

/Users/username/projects/project\u name/lib/sub\u dir/file.rb
/Users/username/projects/project_name/lib/sub_dir/2nd_sub_dir/3rd_sub_dir/file.rb
/Users/username/projects/project\u name/spec/sub\u dir/file.rb
如何使用终端可以获得:

/Users/username/projects/project\u name
注意:我知道
project\u name
下一个目录是
spec/
lib/
您可以使用perl:

cat file | perl -pe "s#(.+)(?:spec|lib).+#\1#"
文件中的位置: /用户/username/projects/project_name/lib/sub_dir/file.rb/username/projects/project_name/lib/sub_dir/2nd_sub_dir/3rd_sub_dir/file.rb/username/projects/project_name/spec/sub_dir/file.rb

或者您可以使用sed:

cat file | sed 's/\(^.*\)\(spec\|lib\).*/\1/'
纯bash(无子进程生成或其他命令)。根据您希望它的灵活性,您可以首先考虑通过<代码> RealLink -FN < /代码>运行<代码> ROOTDIR()/<代码>函数的参数。解释道


你到底想完成什么?当然有更好的办法,但我们必须知道你为什么要这么做。我有一种感觉,这将成为一个。通过
学习了一些新东西。谢谢:-)那么你正在寻找文件路径列表的共同祖先吗?@FredrikPihl Yep:-)我实际上将其更改为
,因此它适用于以下所有代码块。@JonathonReinhart-更好。我将从现在开始使用它。问题是没有文件,只有一个文件层次结构,也就是说,没有要解析的文件。它就像一个符咒,但我正在努力弄清楚它到底是怎么做的。你能给我简要介绍一下吗。谢谢
#!/bin/bash

function rootdir {
  local filename=$1
  local parent=${filename%%/lib/*}
  if [[ $filename == $parent ]]; then
    parent=${filename%%/spec/*}
  fi
  echo $parent
}

# test:
#  rootdir /Users/username/projects/project_name/lib/sub_dir/file.rb
#  rootdir /Users/username/projects/project_name/spec/sub_dir/file.rb
#  rootdir /Users/username/projects/project_name/lib/sub_dir/2nd_sub_dir/3rd_sub_dir/file.rb
# output:
#  /Users/username/projects/project_name
#  /Users/username/projects/project_name
#  /Users/username/projects/project_name