특정 파일을 검색하고 해당 디렉터리로 변경합니다.

특정 파일을 검색하고 해당 디렉터리로 변경합니다.

특정 파일이 포함된 디렉토리로 이동하는 가장 좋은 방법은 무엇입니까? (검색하려는 루트에서 시작한다고 가정합니다). 저는 시그윈을 사용하고 있습니다.

해결책: 나의 최종 해결책은 이것을 .bashrc 파일에 넣는 것이었습니다.

jump2_func() {
cd "$(find . -name $1 -printf %h -quit 2>/dev/null)"
}

alias jump2=jump2_func

답변1

두 부분: 파일을 찾고, 찾은 파일의 디렉터리로 변경합니다.

파일 찾기

시스템의 파일 계층 구조 어딘가에서 파일 이름을 찾으려면 다음 두 가지 방법이 즉시 떠오릅니다.

  1. 사용 find.
  2. 사용 locate.

파일을 찾으려면 다음 명령을 사용하십시오 find.

$ find / -type f -name "filename" -print

이는 루트( )부터 아래로 전체 파일 시스템을 탐색 /하고 이라는 모든 일반 파일의 전체 경로를 인쇄합니다 filename. /검색하려는 디렉터리 경로로 변경하세요 .

파일을 찾으려면 다음을 사용하십시오 locate.

$ locate -r -b '^filename$'

그러면 이름이 명명된 모든 파일(및 디렉터리 등)에 대한 모든 경로가 출력됩니다 filename. 이것은 일반적으로많은를 사용하는 것보다 빠릅니다 find. 여기서는 전체 파일 이름을 일치시키기 위해 정규식을 사용하고 있습니다 . 그렇지 않으면 search -r와 같은 결과가 나올 수 있습니다 . 이 옵션은 경로의 "기본 이름", 즉 각 경로 끝에 있는 실제 파일 이름과만 일치합니다.file3file-blocate

Cygwin에서 사용 하려면 locate먼저 " locate데이터베이스"를 초기화해야 합니다. 다음을 실행하여 이 작업을 수행할 수 있습니다.

$ updatedb

단점은 locate런타임에 존재하는 파일의 위치만 알고 있다는 것입니다. 이것이 대부분의 Unix 시스템이 일반적으로 (또는 이에 상응하는 명령)을 updatedb정기적으로 locate실행하는 이유입니다(Cygwin에서는 사용할 수 없다고 생각합니다) . 일부 Linux에서는 하루에 한 번, OpenBSD에서는 기본적으로 일주일에 한 번 실행됩니다.updatedbcron

찾은 파일의 디렉터리로 변경

이 메서드 중 어느 것도 반환만 보장되지 않으므로하나파일 경로가 있는 경우 작업 디렉터리를 찾은 파일의 디렉터리로 변경하는 안정적인 방법을 생각하기 어렵습니다(여러 개가 있는 경우 어느 것을 선택해야 할까요?).

당신이 선택하고 싶다고 가정 해 봅시다첫 번째결과:

cd "$( dirname "$(somecommand | head -n 1)" )"

여기 또는 위에서 언급한 바와 somecommand같습니다 .findlocate

head -n 1목록의 첫 번째 결과가 선택되고 dirname파일이 포함된 디렉터리의 경로만 추출됩니다. cd그런 다음 작업 디렉터리를 해당 디렉터리로 변경합니다.

참고해서 locate사용 하시면

답변2

cd "$(find . -name filename -printf %h -quit 2>/dev/null)"

해당 이름의 파일이 없으면 cd홈 디렉터리가 변경됩니다. 이것이 원하는 것이 아니라면 다음과 같은 것이 필요합니다.

dir="$(find . -name filename -printf %h -quit 2>/dev/null)"
test -d "$dir" && cd "$dir"

관련 정보