파일 이름 자체 없이 파일 경로를 얻는 방법

파일 이름 자체 없이 파일 경로를 얻는 방법

내 .csv 파일을 찾은 다음 해당 디렉터리로 cd하려고 합니다.

find Documents/notes -type f -name "*.csv" | head -1 | xsel -b

그러면 파일의 첫 번째 디렉터리가 클립보드에 복사되고, 이를 실행하려고 합니다.

cd $(xsel -b) 

하지만 물론 디렉토리가 아닌 파일 이름이 포함되어 있기 때문에 그렇게 할 수 없습니다.

파일명을 생략하는 방법이 있나요? 더 좋은 방법이 있나요?

답변1

bash셸을 사용하여 **패턴을 활성화하고( match , 경로 이름의 과거 *에도 도달 ) 패턴을 확장한 다음 일치하는 첫 번째 디렉터리로 이동합니다./Documents/notes/**/*.csvcd

shopt -s globstar
set -- Documents/notes/**/*.csv
cd "$(dirname "$1")"    # or: cd "${1%/*}"

기본적으로 이 모드가 zsh이미 활성화되어 있는 의 경우 다음 과 같이 단축할 수 있습니다.**

cd Documents/notes/**/*.csv([1]:h)

glob 한정자는 ([1]:h)지정된 패턴에 대해 첫 번째로 일치하는 디렉터리 이름("경로 헤더"에서와 같이 "h")을 반환합니다. (.[1]:h)패턴이 일반 파일(또는 해당 파일에 대한 심볼릭 링크)과만 일치하도록 이 한정자를 변경합니다 .

답변2

예, 다음만 사용하세요 ( 지원 find필요 ).-quit

dir=$(find . -name '*.csv' -print -quit)
cd "$(dirname "$dir")"

또는

cd "$(dirname "$(find . -name '*.csv' -print -quit)")"

첫 번째 게임에서 깨졌습니다.

-quit:

즉시 종료합니다(오류가 발생하지 않으면 반환 값은 0입니다). 이는 -prune과 다릅니다. -prune은 디렉토리의 내용을 정리하는 데만 적용되는 반면, -quit는 find를 즉시 중지하기 때문입니다. 하위 프로세스는 계속 실행되지 않습니다. -exec ... + 또는 -execdir ... +로 구성된 모든 명령줄은 프로그램이 종료되기 전에 호출됩니다. -quit를 실행한 후에는 명령줄에 지정된 파일이 더 이상 처리되지 않습니다. 예를 들어, -quit의 일반적인 용도는 원하는 것을 찾은 후 파일 시스템 검색을 중지하는 것입니다 find /tmp/foo /tmp/bar -print -quit./tmp/foo

관련 정보