find
보다 일반적인 CLI 인터페이스 가있는 대체 프로그램이 있습니까? find
대부분의 다른 유틸리티와는 다른 방식으로 매개 변수가 작동하고 예상됩니다.
설명 : POSIX (또는 적어도 GNU) 명령 줄 권장 사항처럼 작동하고 느껴지는 명령 줄 인터페이스로 찾기와 대부분 동일한 기능을 가진 프로그램을 찾고 있습니다.
ack
되어 더 나은 것이 있는지 궁금해하고있었습니다 find
.
find
보다 일반적인 CLI 인터페이스 가있는 대체 프로그램이 있습니까? find
대부분의 다른 유틸리티와는 다른 방식으로 매개 변수가 작동하고 예상됩니다.
설명 : POSIX (또는 적어도 GNU) 명령 줄 권장 사항처럼 작동하고 느껴지는 명령 줄 인터페이스로 찾기와 대부분 동일한 기능을 가진 프로그램을 찾고 있습니다.
ack
되어 더 나은 것이 있는지 궁금해하고있었습니다 find
.
답변:
이것은 일반적인 오해입니다.
찾기 옵션 구문을 따릅니다. 식 기본을 옵션과 혼동하고 있습니다.
find [-H | -L | -P] [-EXdsx] [-f path] path ... [expression]
[cmd][--> options <--] [--> arg0..argN <--]
대안은 찾습니다. 그러나 find는 더 풍부한 필터 및 작업 옵션 세트를 제공하기 때문에 자체 식 구문을 구현합니다. 단순히 중복 될 수 있기 때문에 동일한 작업을 수행 할 수있는 대안은 없습니다.
find
"대부분의 다른 유틸리티와는 다른 방식으로 매개 변수를 예상 할 수 없다 " 고 주장합니다 . OP는 "표현식 기본을 옵션과 혼동합니다"라고 말합니다. 대부분의 다른 유틸리티는 "표현식 기본"개념을 가지고 있습니까? 그렇지 않다면 OP의 요점 을 보여 주지 않습니까? 그리고 그것은 실제로 사용하는 가장 이상한 부분이 아닙니다 find
. 다른 CLI 관련 사항 {}
(어떻게 탈출해야합니까?)
그것은 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 한정자와 같은 것은 없습니다.
나는 살펴볼 것이다 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
무엇을 찾으려고합니까? 일반적으로 소스 코드 파일을 검색하는 경우를 참조하십시오 ack
. 기본적으로 소스 코드 검색 도구이지만 ack의 -f
스위치는 주어진 파일 형식과 일치하는 파일을 찾습니다.
따라서 디렉토리에서 모든 Perl 파일을 찾으려면 다음과 같이하십시오.
ack -f --perl
ack이 인식하는 파일 형식이 마음에 들지 않으면에 파일 형식을 추가 할 수 있습니다 ~/.ackrc
.
ack는와 같은 범용 파일 찾기가 find
아니지만 소스 코드로 작업하는 경우 매우 유용 할 수 있습니다.
모든 프로그래머가 배워야 할 가장 큰 것 중 하나는 다음과 같습니다. 도구를 찾을 수 없으면 자신 만의 도구를 만드십시오!
#!/usr/bin/bash
find -name $<
-t
필터 유형 등 으로 더 나은 것을 작성할 수 있습니다 .
편집 : 위는 Bash 스크립트입니다. 명령 행 인수를 받아서 -name 옵션의 값으로 찾기 위해 전달합니다. 간단한 예입니다. 이 답변을 작성한 후이 파이썬 스크립트를 찾았습니다.
https://github.com/sjl/friendly-find/
인터페이스는 멋지지만 성능을 테스트하지 않았습니다. 체크 아웃 할 가치가있을 수 있습니다.
$<
내 Bash에서 유용한 일을하지 않습니다. 무엇을 기대하십니까? "$@"
실제로 의미 합니까? 또는 "$1"
(기본적으로 이것이 Makefile에서 의미하는 것입니까)?
$<
는 IS csh
의 동등한 read
나는 그가 그 의미 같은데요은 -.
유닉스에서 물건을 찾는 가장 표준적인 방법.
du -a <directory>|grep <pattern>| awk '{print $2}'
grep | awk
반 패턴입니다. 쓸모없는 사용을grep
참조하십시오 . 패턴을 매개 변수화하려면 다음을 수행하십시오.du -a | awk -v "pat=<pattern>" '$0 ~ pat { print $2 }'
awk
이지만 UNIX 철학의 가장 큰 장점 중 하나는 원하는 것을 수행 할 수있는 파이프 라인을 구성하기 위해 보다 복잡한 도구 (예 : awk
및 find
) 의 모든 기능을 이해할 필요가 없다는 것입니다. 태스크. grep | awk
최적이 아닐 수도 있습니다 (또는 고도로 최적화 된 성능을 가진 고성능 멀티 스레드 시스템 grep
에서는 가능할 수도 있습니다). 그러나 간단 합니다.