이런 경우 Find + Grep보다 find를 더 효율적으로 사용할 수 있나요?

이런 경우 Find + Grep보다 find를 더 효율적으로 사용할 수 있나요?

파일 이름의 일부를 기준으로 현재 폴더와 하위 폴더의 파일을 검색하는 경우가 많습니다. 이 경우에는 find + grep단지 find. 예를 들어

find . | grep user   #19 chars typed

find를 통해서만 작성할 수 있습니다.

find . -path "user*" #21 chars typed

파일을 찾기 위해 고안된 명령을 사용할 때 더 많은 문자를 입력하고 그 중 두 개를 조합하여 사용하는 것은 약간 어리석은 느낌입니다.

문자 입력 시 find만 좀 더 효율적으로 만들 수 있는 방법이 있나요?

답변1

예,

ff () {
    find . -path "*$1*"
}

함수는 다음과 같이 호출됩니다.

ff user

그리고 주어진 문자열을 포함하는 현재 디렉터리 안이나 아래의 모든 경로 이름(파일, 디렉터리 등)을 반환합니다.

~/.bashrc함수 정의는 파일(또는 셸에서 사용하는 해당 셸 초기화 파일) 에 들어가야 하며 다음 시작하는 대화형 셸에서 사용할 수 있습니다.


다음 변형은 경로 이름의 파일 이름 부분만 고려합니다.

ff () {
    find . -name "*$1*"
}

결과를 다음으로 제한하려는 경우일반 파일을 클릭한 다음 통화 -type f에 추가합니다.find

ff () {
    find . -type f -name "*$1*"
}

명령에 주의하세요.

find . -path "user*"

아무것도 출력되지 않습니다. 이는 고려되는 모든 경로 이름이 로 시작하기 때문입니다 ..

마지막 경고: 나는 이것이 대화형으로 사용될 것이라고 가정하고 있습니다.도착하다바라보다결과에서. 이를 스크립트에서 사용하거나 함수에서 반환된 파일 이름에 대해 반복을 수행하려는 경우 "찾기 결과를 반복하는 것이 왜 나쁜 습관입니까?".

답변2

결국 이러한 파일로 뭔가를 하고 싶다고 가정하면, 쉘 완성 시스템이 목록을 표시하고 해당 파일에 대한 항목을 선택하도록 할 수 있습니다.

예를 들어 다음과 같습니다 zsh.

$echo**/*사용자*Tab
완전한 확장
[4/사용자] 1/2/3/사용자
모든 확장을 완료하세요
1/2/3/사용자4/사용자
원본을 완성하세요
**/*사용자*

그런 다음 화살표 키를 사용 Alt+A하여 선택하려는 파일(또는 포함된 파일)을 선택합니다(위의 로 표시된 반전 영상으로 표시됨 [...]). Ctrl+D완성 선택을 시작하지 않고 완성 나열을 참조하세요 .

여기에는 ~/.zshrc최소한 다음이 포함됩니다.

zstyle ':completion:*' completer _expand _complete
zstyle ':completion:*' menu select=0
zstyle ':completion:*' verbose true
zstyle ':completion:*' format 'Completing %d'
zstyle ':completion:*' group-name ''
autoload -Uz compinit
compinit

compinstall마무리 선호도를 조정하기 위해 달리는 것이 좋습니다 .

위에서 **/*user*반환된 파일이름포함 user(숨겨진 파일과 숨겨진 디렉터리의 파일을 제외하고, (D)다시 원할 경우 glob 한정자를 추가하세요). 파일용포함 user, ( **/*~^*user*필요에 따라)로 변경합니다.set -o extendedglob~/.zshrc

이는 정렬된 목록을 제공하는 이점도 있으며, 에 다음을 추가하면 파일 형식을 식별하는 데 도움이 되는 색상 ls --colour목록(GNU와 유사)을 얻을 수 있습니다 ./@

eval "$(dircolors ~/.dircolors)"
zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS}

당신을 위한 ~/.zshrc.

또한 완성 출력은 find사람이 소비하도록 의도되었기 때문에 줄 바꿈이나 기타 인쇄할 수 없는 문자가 포함된 파일 이름과 관련된 문제를 방지합니다.

zsh유효한 문자를 형성하지 않는 바이트 시퀀스를 포함하는 파일 이름에 대한 문제(적어도 GNU의 경우)도 없습니다 find(예: UTF-8 로케일에서는 디렉터리에서 파일을 찾을 수 없습니다).findfind -path '*user*'user$'St\xe9phane'

답변3

find경로가 정의되지 않은 경우 GNU 버전은 기본적으로 현재 디렉터리로 설정됩니다.

find -name "user*" # 18 chars typed plus enter.

답변4

당신이 사용하는 경우,한 번,pip install gringrin명령 및 유틸리티를 얻을 수 있습니다 grind.(현재로서는 Python 2만 있는 것 같습니다.)

grind를 사용하면 쿼리는 다음과 같습니다.

grind user*

11자입니다.

물론 Python 방식을 사용하는 경우 가장 자주 수행하는 검색을 수행하도록 사용자 정의된 floc라는 파일을 경로에 항상 둘 수 있습니다.

#!/usr/bin/env python3
from glob import glob
import sys
for arg in sys.argv[1:]:
   print('\n'.join(glob('**/{}*'.format(arg), recursive=True)))

그런 다음 chmod +x floc실행 가능하게 만듭니다. 그러면 귀하의 쿼리는 다음과 같습니다.

floc user

최대 9자. 물론 원래 명령에 대한 셸 별칭을 만들어 유사한 감소를 얻을 수도 있습니다.

관련 정보