찾을 대안? [닫은]


30

find보다 일반적인 CLI 인터페이스 가있는 대체 프로그램이 있습니까? find대부분의 다른 유틸리티와는 다른 방식으로 매개 변수가 작동하고 예상됩니다.

설명 : POSIX (또는 적어도 GNU) 명령 줄 권장 사항처럼 작동하고 느껴지는 명령 줄 인터페이스로 찾기와 대부분 동일한 기능을 가진 프로그램을 찾고 있습니다.


7
GNU find는 명령 행에 대한 POSIX (또는 GNU) 지침을 존중하지 않습니다. 예를 들어, 매개 변수의 순서, 단일 대시가있는 다중 문자 옵션 등은 적합한 프로그램과 다릅니다.
Tamás Szelei

3
나는 알고 있고 항상 어떤 식 으로든 내가 원하는 것을 할 수 있습니다. 나는 최근에 알게 ack되어 더 나은 것이 있는지 궁금해하고있었습니다 find.
Tamás Szelei

2
아시다시피, 나는 작은 프로그래밍 언어를 원하지 않지만 더 단순하고 직관적이며 일관된 찾기를 원합니다 (일부 고급 기능의 손실을 의미하더라도). 프로그램 작성을 정당화하는 작업에 직면했을 때 나는 그렇습니다.
Tamás Szelei

2
찾기는 일관되고 (내 대답 참조) 직관적입니다. 프라이 머리 이름이 이상한 것 같지는 않습니다. -exec는 실행, -print는 인쇄, -name은 이름과 일치 함을 의미합니다. 실제로, 전자의 3 및 유형은 사용 사례의 95 %를 차지합니다. 다른 모든 경우에는 사람이 있습니다.
Mel

3
@ tamas 나는 한 시간 전에 편집했으며 찾기 이외의 대안은 없다고 말했습니다. 그리고 아마도 ls -R은 그것을 생각하게 될 것입니다. 다른 대안은 find를 에뮬레이트하는 GUI 프로그램입니다. 그렇지 않으면 찾기 대안으로 원하는 것을 지정해야합니다. 더디 나무를 걸어? 필터 파일 이름? 그때 어떤 파일이 최신인지 알려주세요.
Mel

답변:


11

이것은 일반적인 오해입니다.

찾기 옵션 구문을 따릅니다. 식 기본을 옵션과 혼동하고 있습니다.

 find [-H | -L | -P] [-EXdsx] [-f path] path ... [expression]
 [cmd][-->        options          <--] [--> arg0..argN  <--]

대안은 찾습니다. 그러나 find는 더 풍부한 필터 및 작업 옵션 세트를 제공하기 때문에 자체 식 구문을 구현합니다. 단순히 중복 될 수 있기 때문에 동일한 작업을 수행 할 수있는 대안은 없습니다.


5
그것이 내 잘못이더라도 내 질문에 대답하지 않습니다.
Tamás Szelei

expression (하나만 허용됩니까?), cmd (dito?), options 및 args의 차이점은 무엇입니까?
사용자가 알 수 없음

@user unknown-find 명령은 자체 표현식 구문을 구현합니다. 주어진 경우, 표현식은 명령 행의 마지막 인수입니다. 없으면 expression은 -print로 확인됩니다.
Mel

아-이제는 [cmd]가 [expression]을 따르지 않지만 이전 줄에 대한 설명입니다.
사용자가 알 수 없음

2
OP는 find"대부분의 다른 유틸리티와는 다른 방식으로 매개 변수를 예상 할 수 없다 " 고 주장합니다 . OP는 "표현식 기본을 옵션과 혼동합니다"라고 말합니다. 대부분의 다른 유틸리티는 "표현식 기본"개념을 가지고 있습니까? 그렇지 않다면 OP의 요점 을 보여 주지 않습니까? 그리고 그것은 실제로 사용하는 가장 이상한 부분이 아닙니다 find. 다른 CLI 관련 사항 {}(어떻게 탈출해야합니까?)
Kyle Strand

10

그것은 find당신이 의지하고 있는 정확한 기능에 달려 있습니다. (주로) 찾기 기능인 경우 일부 쉘은 재귀 글로브를 지원합니다. 예를 들면 다음과 zsh같습니다.

% find . -name \*c
./a/b/foo.c
./a/bar.c
./baz.c
inoshiro% ls *.c
baz.c
% ls **/*.c 
a/bar.c  a/b/foo.c  baz.c

Zsh는 glob 한정자를 통해 훨씬 더 유사한 가능성을 가지고 있습니다 (끝 부분 근처에 있음 man zshexpn). 예를 들면 다음과 같습니다.

ls -l **/*(.)  ≈   find -type f -ls
ls *(m-2u:$USER:)  ≈  find -mtime -2 -user $USER

Bash 4에는 **/(로 활성화해야 함 shopt -s globstar) 있지만 glob 한정자와 같은 것은 없습니다.


10

나는 살펴볼 것이다 locate. 파일 데이터베이스를 살펴보고 사용자가 지정한 것과 일치하는 경로 이름을 빠르게 인쇄합니다.

kevin@box:~$ locate odg
/home/kevin/Documents/final.odg
/usr/share/doc/packages/sysconfig/netconfig.odg
/usr/share/gimp/2.0/help/en/gimp-tool-dodge-burn.html
....
kevin@box:~$ locate .odg
/home/kevin/Documents/final.odg
/usr/share/doc/packages/sysconfig/netconfig.odg
kevin@box:~$ 

당신이 볼 수 있듯이, 그것은 서브 텍스트 이상형 : 당신이 그것을 주면 odg, 다음은 D 일치 ODG의 전자. 그러나 당신이 그것을 준다면 .odg, 그렇지 않을 것입니다.

그러나 단점이 있습니다. 데이터베이스가 필요합니다. 상황이 바뀌면이 데이터베이스를 업데이트해야합니다. Fedora 13을 설치하면 매일 crontab에 저장됩니다.


나는 사랑locate
앤드류 램버트에게

1
또한 locate는 패턴을 받아들입니다 (최근에 이것을 배웠습니다).
Adam Byrtek

5

무엇을 찾으려고합니까? 일반적으로 소스 코드 파일을 검색하는 경우를 참조하십시오 ack. 기본적으로 소스 코드 검색 도구이지만 ack의 -f스위치는 주어진 파일 형식과 일치하는 파일을 찾습니다.

따라서 디렉토리에서 모든 Perl 파일을 찾으려면 다음과 같이하십시오.

ack -f --perl

ack이 인식하는 파일 형식이 마음에 들지 않으면에 파일 형식을 추가 할 수 있습니다 ~/.ackrc.

ack는와 같은 범용 파일 찾기가 find아니지만 소스 코드로 작업하는 경우 매우 유용 할 수 있습니다.


1
이것은 사용자가 질문하지만 사람들이 소스 (그렙 같은) 코드의 발견에 매우 유용 찾을 수있는 것이 아니다 실버 검색 자 , silversearcher-ag주요 배포판의 패키지.
Pablo A

-1

모든 프로그래머가 배워야 할 가장 큰 것 중 하나는 다음과 같습니다. 도구를 찾을 수 없으면 자신 만의 도구를 만드십시오!

#!/usr/bin/bash
find -name $<

-t필터 유형 등 으로 더 나은 것을 작성할 수 있습니다 .

편집 : 위는 Bash 스크립트입니다. 명령 행 인수를 받아서 -name 옵션의 값으로 찾기 위해 전달합니다. 간단한 예입니다. 이 답변을 작성한 후이 파이썬 스크립트를 찾았습니다.

https://github.com/sjl/friendly-find/

인터페이스는 멋지지만 성능을 테스트하지 않았습니다. 체크 아웃 할 가치가있을 수 있습니다.


1
자체 도구 설명을 작성하는 데 적합합니다. 그러나 최소한 작은 스크립트가 어떻게 작동하는지 설명하십시오.
jippie

1
$<내 Bash에서 유용한 일을하지 않습니다. 무엇을 기대하십니까? "$@"실제로 의미 합니까? 또는 "$1"(기본적으로 이것이 Makefile에서 의미하는 것입니까)?
tripleee

1
@tripleee - $<는 IS csh의 동등한 read나는 그가 그 의미 같은데요은 -.
DarkHeart

-2

유닉스에서 물건을 찾는 가장 표준적인 방법.

du -a <directory>|grep <pattern>| awk  '{print $2}'

1
grep | awk반 패턴입니다. 쓸모없는 사용을grep 참조하십시오 . 패턴을 매개 변수화하려면 다음을 수행하십시오.du -a | awk -v "pat=<pattern>" '$0 ~ pat { print $2 }'
tripleee

@tripleee 매우 유용한 정보 awk이지만 UNIX 철학의 가장 큰 장점 중 하나는 원하는 것을 수행 할 수있는 파이프 라인을 구성하기 위해 보다 복잡한 도구 (예 : awkfind) 의 모든 기능을 이해할 필요가 없다는 것입니다. 태스크. grep | awk최적이 아닐 수도 있습니다 (또는 고도로 최적화 된 성능을 가진 고성능 멀티 스레드 시스템 grep에서는 가능할 수도 있습니다). 그러나 간단 합니다.
Kyle Strand
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.