locate gtags
이라는 이름의 모든 파일을 찾습니다 gtags
.
실행 파일만 필요한 경우 어떻게 해야 합니까? 이를 수행할 수 있는 방법이 있습니까?
답변1
쉬운 일이 아닙니다. 당신은 그것을 사용할 수 있습니다
locate bash | while IFS= read -r line; do [[ -x "$line" ]] && echo $line; done
이름에 가 포함된 모든 실행 파일을 찾습니다 bash
. 이는 find
몇 개의 파일만 확인하면 되므로 전체 파일 시스템을 사용하는 것보다 빠릅니다.
locate bash
항상 하는 일을 수행합니다(일치하는 항목 모두 나열).|
(파이프)는 첫 번째 명령( )의 출력을 가져locate
와서 두 번째 명령(줄의 나머지 부분)으로 보냅니다.- 루프는
while ...; do ... done
파이프(에서)로부터locate
수신된 각 행을 반복합니다. read -r line
입력 라인을 읽고 이를line
(이 경우 경로/파일 이름)이라는 변수 에 저장합니다.[[ -x "$line" ]]
파일이$line
실행 가능한지 테스트- 그렇다면
&& echo $line
위젯은 이를 화면에 인쇄합니다.
답변2
가장 빠르고 저렴한 솔루션:
locate -b '\gtags' | xargs -ri find {} -prune -type f -executable
xargs
매뉴얼 페이지 에 따르면 위 구문은 발견된 모든 파일 이름을 지정된 파일만 확인하는 locate
단일 실행으로 전달합니다.find
이 솔루션은 다음과 같은 이유로 이전에 제공된 솔루션보다 낫습니다.
find
루트 디렉터리부터 시작하여 시스템의 모든 파일을 검색하는 짧은 명령일 수 있지만 실행하는 데 시간이 오래 걸릴 수 있습니다 .- 쉘 while 루프를 사용하여 각 파일 이름을 확인하는 것은 각 파일을 한 번에 하나씩 확인하기 때문에 속도가 느려질 수 있습니다.
다른 사람들이 이전 답변에 제공된 매개 변수에 대한 자세한 설명을 요청했기 때문에 세부 사항은 다음과 같습니다.
locate
(바라보다:통화 위치 찾기 - 파일 찾기)-b
: 경로 이름의 디렉터리 이름에 관계없이 지정된 패턴을 가진 경로 이름의 기본 파일 이름만 일치합니다.\
: 백슬래시는 와일드카드이므로locate
패턴이gtags
고려되지 않습니다*gtags*
. 즉, 앞뒤에 다른 문자가 없고 정확한 이름이 'gtags'인 파일을 찾습니다.
xargs
(바라보다:xargs 옵션 - 파일 찾기)-r
: 표준 입력이 완전히 비어 있으면 명령이 실행되지 않습니다.-i
:{}
다음 명령을 표준 입력에서 읽은 파일 이름 목록으로 바꿉니다.
find
(바라보다:마스터 인덱스 찾기 - 파일 찾기){}
xargs
: 표준 입력에서 받은 모든 파일의 이름 으로 바꿉니다 . 이러한 모든 파일은 다음 표현식과 일치하는 항목을 검색하며, 파일 중 하나라도 디렉터리인 경우 해당 내용도 확인합니다.locate
find
-prune
: 평가 중인 파일 이름이 디렉터리에 속해 있으면 해당 내용을 검색하지 마세요.-type f
: 장치, 명명된 파이프 등과 같은 특수 파일 이름이 아닌 "일반" 파일인 파일 이름만 출력에 포함합니다.-executable
: 출력에는 실행 파일의 파일 이름만 포함됩니다. 즉, 파일 내용에 관계없이 하나 이상의 실행 모드 비트가 설정됩니다.
즉, locate
일치하는 파일의 이름을 표준 출력으로 인쇄하고, 이는 |
표준 입력으로 파이프( 사용) 됩니다 xargs
. xargs
표준 입력에서 파일 이름을 읽고 단일 문자열의 공백으로 구분된 목록으로 결합합니다. 문자열이 비어 있지 않으면 명령을 실행하기 전에 명령의 문자열을 바꿉니다 xargs
.{}
find
답변3
짧은 대답은 GNU 찾기를 사용하십시오.
find / -type f -executable -name '*gtags*'