2013-10-18 1 views
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 

N.B.

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

파일 : /Users/username/projects/project_name/lib/sub_dir/file.rb 나는 project_name에서 아래로 다음 디렉토리가 spec/ 또는 lib/

+2

* 실제로 수행하려는 작업은 무엇입니까? 확실하게 더 좋은 방법이 있습니다. 그러나 우리는 왜 당신이 이것을하려고 하는지를 알아야합니다. 나는 이것이 [XY 문제] (http://www.perlmonks.org/?node_id=542341)로 밝혀 질 것이라는 느낌을 가지고 있습니다. –

+0

''고맙습니다 :-)로 새로운 것을 배웠습니다 –

+2

그래서 파일 경로 목록에 공통 조상을 찾고 있습니까? – damienfrancois

답변

1

순수한 bash (하위 프로세스 생성 또는 다른 명령 없음). 얼마나 유연한 지에 따라 rootdir() 인수를 먼저 실행하여 readlink -fn을 통해 실행하는 것이 좋습니다. 설명했다. here.

#!/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 
+0

그것은 매력처럼 작동하지만, 나는 그것이 무엇을하는지 정확하게 내 머리를 얻기 위해 고투하고 있습니다. 나 좀 빨리 줄 수있어? 감사. – dwkns

+0

http://www.tldp.org/LDP/abs/html/abs-guide.html#VARMATCH – bobah

0

당신이 펄을 사용할 수있는 것을 알고 /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

하거나 사용할 수 있습니다 나오지 :

cat file | sed 's/\(^.*\)\(spec\|lib\).*/\1/' 
+0

문제는 파일 * 계층 구조 즉, 구문 분석 할 파일이 없습니다. –

관련 문제