내 .csv 파일을 찾은 다음 해당 디렉터리로 cd하려고 합니다.
find Documents/notes -type f -name "*.csv" | head -1 | xsel -b
그러면 파일의 첫 번째 디렉터리가 클립보드에 복사되고, 이를 실행하려고 합니다.
cd $(xsel -b)
하지만 물론 디렉토리가 아닌 파일 이름이 포함되어 있기 때문에 그렇게 할 수 없습니다.
파일명을 생략하는 방법이 있나요? 더 좋은 방법이 있나요?
답변1
bash
셸을 사용하여 **
패턴을 활성화하고( match , 경로 이름의 과거 *
에도 도달 ) 패턴을 확장한 다음 일치하는 첫 번째 디렉터리로 이동합니다./
Documents/notes/**/*.csv
cd
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