특정 파일이 포함된 디렉토리로 이동하는 가장 좋은 방법은 무엇입니까? (검색하려는 루트에서 시작한다고 가정합니다). 저는 시그윈을 사용하고 있습니다.
해결책: 나의 최종 해결책은 이것을 .bashrc 파일에 넣는 것이었습니다.
jump2_func() {
cd "$(find . -name $1 -printf %h -quit 2>/dev/null)"
}
alias jump2=jump2_func
답변1
두 부분: 파일을 찾고, 찾은 파일의 디렉터리로 변경합니다.
파일 찾기
시스템의 파일 계층 구조 어딘가에서 파일 이름을 찾으려면 다음 두 가지 방법이 즉시 떠오릅니다.
- 사용
find
. - 사용
locate
.
파일을 찾으려면 다음 명령을 사용하십시오 find
.
$ find / -type f -name "filename" -print
이는 루트( )부터 아래로 전체 파일 시스템을 탐색 /
하고 이라는 모든 일반 파일의 전체 경로를 인쇄합니다 filename
. /
검색하려는 디렉터리 경로로 변경하세요 .
파일을 찾으려면 다음을 사용하십시오 locate
.
$ locate -r -b '^filename$'
그러면 이름이 명명된 모든 파일(및 디렉터리 등)에 대한 모든 경로가 출력됩니다 filename
. 이것은 일반적으로많은를 사용하는 것보다 빠릅니다 find
. 여기서는 전체 파일 이름을 일치시키기 위해 정규식을 사용하고 있습니다 . 그렇지 않으면 search -r
와 같은 결과가 나올 수 있습니다 . 이 옵션은 경로의 "기본 이름", 즉 각 경로 끝에 있는 실제 파일 이름과만 일치합니다.file3
file
-b
locate
Cygwin에서 사용 하려면 locate
먼저 " locate
데이터베이스"를 초기화해야 합니다. 다음을 실행하여 이 작업을 수행할 수 있습니다.
$ updatedb
단점은 locate
런타임에 존재하는 파일의 위치만 알고 있다는 것입니다. 이것이 대부분의 Unix 시스템이 일반적으로 (또는 이에 상응하는 명령)을 updatedb
정기적으로 locate
실행하는 이유입니다(Cygwin에서는 사용할 수 없다고 생각합니다) . 일부 Linux에서는 하루에 한 번, OpenBSD에서는 기본적으로 일주일에 한 번 실행됩니다.updatedb
cron
찾은 파일의 디렉터리로 변경
이 메서드 중 어느 것도 반환만 보장되지 않으므로하나파일 경로가 있는 경우 작업 디렉터리를 찾은 파일의 디렉터리로 변경하는 안정적인 방법을 생각하기 어렵습니다(여러 개가 있는 경우 어느 것을 선택해야 할까요?).
당신이 선택하고 싶다고 가정 해 봅시다첫 번째결과:
cd "$( dirname "$(somecommand | head -n 1)" )"
여기 또는 위에서 언급한 바와 somecommand
같습니다 .find
locate
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"