0

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

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

/Users/username/projects/project_name/lib/sub_dir/file.rb
/Users/username/projects/project_name/lib/sub_dir/2nd_sub_dir/3rd_sub_dir/file.rb
/Users/username/projects/project_name/spec/sub_dir/file.rb

我如何使用终端:

/Users/username/projects/project_name

注意我知道下一个目录project_namespec/lib/

4

2 回答 2

1

纯 bash(没有子进程产生或其他命令)。根据您希望它的灵活性,您可能需要考虑首先运行rootdir()函数的参数readlink -fn在这里解释。

#!/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
于 2013-10-18T21:51:24.953 回答
0

你可以使用 perl:

cat file | perl -pe "s#(.+)(?:spec|lib).+#\1#"

在文件中的位置:/Users/username/projects/project_name/lib/sub_dir/file.rb /Users/username/projects/project_name/lib/sub_dir/2nd_sub_dir/3rd_sub_dir/file.rb /Users/username/projects/project_name/spec /sub_dir/file.rb

或者你可以使用 sed:

cat file | sed 's/\(^.*\)\(spec\|lib\).*/\1/'
于 2013-10-18T21:42:59.497 回答