파일이나 디렉토리 이름에 특정 단어가 나타나는 모든 디렉토리를 나열하는 명령이 있습니까?

파일이나 디렉토리 이름에 특정 단어가 나타나는 모든 디렉토리를 나열하는 명령이 있습니까?

나는 파일이나 폴더가 어디에 있는지 기억이 나지 않을 때 가끔 이 명령을 사용합니다. locate(이 명령은 더 많은 항목을 찾아서 .보다 더 많은 후보를 허용할 것 같습니다
. 하지만 제가 틀렸을 수도 있습니다.)find

하지만 당연히 다음과 같은 반응이 많이 나왔습니다.

locate clang
/data/sauvegardes/dev/Java/Experimentations/Angular4/bikes/node_modules/blocking-proxy/.clang-format
/data/sauvegardes/dev/Java/Experimentations/Angular4/bikes/node_modules/node-gyp/gyp/tools/Xcode/Specifications/gyp.xclangspec
/data/sauvegardes/dev/Java/Experimentations/Angular6/ng6-proj/node_modules/blocking-proxy/.clang-format
/data/sauvegardes/dev/Java/Experimentations/Angular6/ng6-proj/node_modules/node-gyp/gyp/tools/Xcode/Specifications/gyp.xclangspec
/data/sauvegardes/dev/Java/Experimentations/blog-demo/node/node_modules/npm/node_modules/node-gyp/gyp/tools/Xcode/Specifications/gyp.xclangspec
/data/sauvegardes/dev/Java/Experimentations/blog-demo/node_modules/blocking-proxy/.clang-format
/data/sauvegardes/dev/Java/Experimentations/blog-demo/node_modules/node-gyp/gyp/tools/Xcode/Specifications/gyp.xclangspec
/data/sauvegardes/dev/Java/Experimentations/ol-ext-angular/.metadata/.plugins/ts.eclipse.ide.server.nodejs.embed.win32.win32.x86_64/node-v6.9.4-win-x64/node_modules/npm/node_modules/node-gyp/gyp/tools/Xcode/Specifications/gyp.xclangspec

(201 responses)

이 명령을 파이프하여 및 를 사용하여 dirname이름에 해당 단어가 포함된 디렉터리만 나열하거나 해당 단어가 포함된 하나 이상의 파일을 전달합니다.sortuniq

locate clang | xargs -L1 dirname | sort | uniq

효과가있다...

/home/lebihan/dev/Java/comptes-france/metier-et-gestion/AdapterInboundWebEtude/etude/node_modules/node-gyp/gyp/tools/Xcode/Specifications
/home/lebihan/dev/Java/comptes-france/metier-et-gestion/AdapterInboundWebEtude/etude/node/node_modules/npm/node_modules/node-gyp/gyp/tools/Xcode/Specifications
/usr/include/boost/align/detail
/usr/include/boost/config/compiler
/usr/include/boost/predef/compiler
/usr/lib/linux-kbuild-6.1/scripts
/usr/lib/llvm-14/lib
/usr/lib/postgresql/14/lib/bitcode/postgres/commands
/usr/lib/x86_64-linux-gnu
/usr/local/go/misc/ios
/usr/local/go/src/debug/dwarf/testdata
/usr/local/go/src/debug/elf/testdata
/usr/local/go/src/debug/macho/testdata
/usr/share/doc
/usr/share/doc/libclang1-14
/usr/share/doc/libclang-cpp14

(108 responses)

하지만 실제로리눅스같은 일을 더 쉽게 할 수 있는 명령이 있나요?

답변1

음, GNU 시스템을 사용한다면 GNU를 사용하여 출력 형식을 지정할 수 find있습니다 -printf. sort특정 작업에 대해 별도의 명령을 사용하는 것이 KISS 개념을 어느 정도 만족시키기 때문에 계속 유지하는 것이 좋습니다. 하지만 sort존재하므로 -u생략 uniq할 수 있습니다.

find . -name '*targetstring*' -printf '%h\n' | sort -u

디렉터리 이름의 줄 바꿈을 처리하려면 약간의 추가 노력이 필요합니다.

find . -name '*targetstring*' -printf '%h\0' |
  LC_ALL=C sort -zu |
  tr '\0' '\n'

( LC_ALL=C또한 유효한 텍스트로 구성되지 않거나 사용자의 로케일에서 동일한 순서의 문자를 포함하는 파일 경로의 문제를 방지합니다.)

기본 이름뿐만 아니라 경로의 어느 곳 이든 찾으려면 다음 -name으로 바꾸십시오 .-pathtargetstring

-z-printfGNU 확장입니다 .

답변2

zsh껍질 에

(){ print -rC1 -- ${(u)@}; } **/*clang*(ND:h)

.을 포함하는 이름이 print r열에 1 C표시 됩니다 .uhclang

익명 함수를 다음과 같이 하십시오 printu(for독특한 프린팅) 그 중 하나를 말해보세요:

printu() print -rC1 -- "${(u)@}"

당신이 그것을 쓸 수 있습니다 :

printu **/*clang*(ND:h)

파일 헤더의 경우(기본 이름뿐만 아니라) 다음이 포함됩니다 clang.

set -o extendedglob
printu **/*~^*clang*(ND:h)

( ~거긴 어디에 있어?와는 별개로확산 연산자 ^아니요확산 연산자).

답변3

제가 아는 한, 귀하의 요구 사항을 충족하는 항목은 아직 없습니다. 하지만 솔루션을 작성할 수 있다면 이를 명령(함수 또는 스크립트)으로 변환할 수 있습니다.

.bashrc예를 들어, 이는 귀하의 또는 이에 상응하는 정의 에 포함될 수 있습니다 dlocate.

dlocate() {
    locate -0eb -- "$1" |
        while IFS= read -d '' -r x; do [ -d "$x" ] && printf '%s\n' "$x"; done
}

또는 해당 스크립트를 생성하여 디렉터리에 나열된 디렉터리 중 하나에 넣을 수 있습니다 $PATH(저는 일반적으로 $HOME/bin또는 을 사용합니다 /usr/local/bin.)

어느 쪽이든 이 명령은 제공된 이름 조각이 포함된 디렉터리를 dlocate데이터베이스에서 검색합니다 . locate예를 들어 다음을 포함하는 모든 디렉터리 이름과 일치합니다 net.

dlocate net

내 시스템에는 다음과 같은 디렉토리가 포함됩니다.

/usr/include/net
/usr/share/doc/update-inetd
/usr/share/pixmaps/nethack

이 루프는 해당 필터와 일치하는 모든 파일 및 디렉터리가 반환되므로 while디렉터리가 아닌 모든 항목을 제외해야 합니다 . locate디렉토리에 대한 심볼릭 링크를 찾았지만 조건부 체인 [ -d "$x" ]으로 확장하여 이를 제외할 수 있습니다.[ -d "$x" ] && [ ! -h "$x" ]

관련 정보