이 세 가지 명령이 동일한 기능을 수행합니까?
grep을 사용하는 명령입니다.
grep "a" -r .
찾기를 사용하는 명령입니다.
find . -exec grep "a" {} \;
xargs를 통해 찾기에 grep을 사용하는 명령입니다.
find . | xargs grep "a"
답변1
그들은 동일하지 않으며 각각 문제가 있습니다.
- 첫 번째는 Gnu 확장을 사용하므로 이식성이 없습니다. 게다가 옵션은 패턴 뒤가 아니라 패턴 앞에 있어야 합니다.
- 두 번째는 이미 언급한 것처럼 파일 이름을 표시하지 않습니다.
- 파일 이름에 공백이나 이와 유사한 내용이 포함되어 있으면 세 번째 작업은 실패합니다.
대신 다음을 사용합니다.
find . -type f -exec grep a /dev/null {} +
이식 가능하고, 비정규 파일을 무시하고, 이상한 파일 이름과 충돌하지 않으며, 패턴이 발견되면 항상 파일 이름을 표시합니다.
답변2
숙제 질문인가요?
시도해 보셨나요?
그들은 약간 다른 일을 합니다.
예를 들어, 단일 파일 이름을 입력하면 grep
출력 시 파일 이름이 에코되지 않습니다. grep
와 함께 사용하면 실망스러울 수 있습니다 find
.
답변3
"같은 일을 한다"라고 정의하는 것이 더 좋습니다. 첫 번째 명령은 하나의 명령을 실행하고, 두 번째 명령은 발견된 파일당 한 번씩 find 및 fork+exec의 grep을 실행하며, 세 번째 명령은 최소 3개의 명령을 실행합니다. 하나의 명령줄에 들어갈 수 없을 정도로 파일이 너무 많으면 그 이상을 실행합니다. CPU/메모리에 미치는 영향에 관해서는 가장 뚜렷하게 나타납니다.~ 아니다동일한 작업을 수행합니다. 1, 3 및 프로세스 "전체"의 차이는 중요합니다.
파일 시스템 관점에서 파일 시스템을 탐색하고 각 파일을 통계한 다음 열고 완전히 읽고 닫습니다. 따라서 그들은 모두 그 관점에서 동일한 작업을 수행하며 파일 시스템은 차이점을 인식하지 못합니다(수백만 개의 프로세스를 포크하여 오버헤드로 인해 두 번째 인스턴스에서 탐색이 느려지는 것을 제외하고).
화면에 표시되는 출력은 다르며 그 차이는 몇 가지 가능한 디렉터리 구조로 명령을 실행하여 경험적으로 확인할 수 있습니다(한 가지 확실한 방법은 redgrittybrick이 언급한 것입니다).
서로 다른 문자 수와 구문 오류 가능성으로 인해 입력하는 데 소요되는 시간이 다릅니다.
등등. 상황이 "다를" 수 있는 방법에는 여러 가지가 있습니다. :)