구별 명령이 로컬 두 번째 실행 프로그램이 아닙니다.

구별 명령이 로컬 두 번째 실행 프로그램이 아닙니다.

생각하다

[root@iz2ze9wve43n2nyuvmsfx5z /]# find . -maxdepth 2 -type d  | ls
bin   dev  home  lib64       media  opt   root  sbin  sys  usr
boot  etc  lib   lost+found  mnt    proc  run   srv   tmp  var

ls는 아무것도 하지 않습니다. 구조 차원에서 ls 목록으로 다시 작성해야 합니다.

find . -type d | xargs ls
#millions of outputs

그러나 grep은 훌륭한 작업을 수행합니다.

[root@iz2ze9wve43n2nyuvmsfx5z /]# find . -maxdepth 2 -type d  | grep home
./home

명령이 시행착오 테스트 및 암기가 아닌 두 번째 방사체로 탄생한 것이 아니라는 근본적인 이해를 어떻게 알 수 있습니까?

답변1

다양한 프로그램의 기능을 배우고 기억하거나 매뉴얼 페이지를 읽어보세요.

설명 ls은 다음과 같습니다

파일에 대한 정보 나열(기본값은 현재 디렉터리)

여기서 FILE은 요약을 나타냅니다.

ls [옵션]... [파일]...

기억해야 할 중요한 부분은 ls귀하가 제공한 "파일"에 대한 정보를 생성한다는 것입니다.명령줄에서. 매뉴얼에는 ls입력(예: 파이프에서)을 읽는 방법이 설명되어 있지 않습니다.

ls예를 들어 매뉴얼 페이지를 cat매뉴얼 페이지와 비교하십시오.

cat [옵션]... [파일]...

파일을 표준 출력에 연결합니다. FILE이 없거나 FILE이 -이면 표준 입력을 읽습니다.

그것으로 cat당신은 할 수 있습니다, cat /some/file또는 당신은 할 수 있습니다 echo hi | cat.

첫 번째 예에서는

find . -maxdepth 2 -type d  | ls

find일부 작업을 수행하고 표준 출력에 일부 디렉터리 이름을 전달하거나 전달하지 않으면 해당 디렉터리 이름이 ls표준 입력이 되며 ls즉시 무시됩니다. 나열할 파일을 제공하지 않으므로 ls기본적으로 현재 디렉터리를 나열합니다.

두 번째 예에서는

find . -type d | xargs ls

find(더 많은) 작업을 수행하고 표준 출력에 있는 모든 디렉터리를 생성한 다음 xargs표준 입력으로 렌더링합니다. 매뉴얼 페이지 의 일부는 xargs다음과 같습니다.

xargs는 표준 입력에서 항목을 읽고 명령을 한 번 이상 실행합니다...

stdin의 입력 줄 수가 주어지면 ls필요한 만큼 호출됩니다.

세 번째 명령에도 동일한 아이디어가 적용됩니다.

find . -maxdepth 2 -type d  | grep home

find디렉토리 이름을 grepstdin에 다시 전달하십시오. grep의 매뉴얼 페이지에는 다음과 같은 내용이 부분적으로 나와 있습니다.

grep은 지정된 입력 파일에서 주어진 패턴과 일치하는 행을 검색합니다. 파일이 지정되지 않거나 파일 "-"가 제공되면 grep은 표준 입력을 검색합니다.

파이프의 아이디어는 간단하지만 강력합니다. 프로그램이 생성하는 출력과 프로그램이 표준 입력에서 입력을 사용할 수 있는지 여부만 알면 됩니다.

grep이러한 상황에서 가장 일반적으로 사용되는 도구 중 하나입니다. 다음을 기본 명령으로 사용할 수 있습니다.

grep some-text file1 file2 file3 ...

이 경우 grep파일 이름을 알고 있거나 표준 입력으로 입력을 보낼 수 있습니다.

cat file1 file2 file3 ... | grep some-text

...이 경우 grep은 이제 더 이상 파일 이름을 알지 못하므로( cat파일 이름을 알고 그 내용을 표준 출력으로 생성함) 이제 grep은 어떤 파일에 텍스트가 포함되어 있는지 알 수 없으며 어떤 줄이 일치하는지 알 수 없습니다.

여러 명령을 함께 연결하고 싶은 유혹이 있습니다("단일 줄"이 터미널 창에서 두 번째 줄을 둘러쌀 만큼 길어질 수 있기 때문에 농담 반으로 "단일 줄"이라고도 함). 마찬가지로, 프로그램이 입력을 생성하고 소비하는 방법을 정확히 알아야 합니다.

file1, 및 file2이라는 파일이 주어지면file3할 수 있는다음과 같이 하십시오:

find . -name 'file*' | xargs cat

find세 개의 파일 이름이 표준 출력으로 생성되어도 놀라지 않을 것입니다.

file1 
file2 
file3

... xargs는 목록을 컴파일하여 다음으로 보냅니다 cat.

cat file1 file2 file3

...그 세 개의 파일 이름을 보고 그 내용을 화면에 충실하게 덤프하는 사람.

find명령은 "filenamehere"라는 파일을 출력합니다.

file name here
file1
file2
file3

... xags는 이에 대한 목록을 컴파일합니다 cat.

cat file name here file1 file2 file3

... cat그것에 대해 불평합니다 (stderr에게!):

cat: file: 해당 파일이나 디렉터리가 없습니다.

cat: 이름: 해당 파일이나 디렉터리가 없습니다.

cat: 여기: 해당 파일이나 디렉터리가 없습니다

...다음에는 file1, file2 및 file3의 내용이 옵니다.

이제 파일 이름 구분 기호로 NULL을 사용하는 find ... -exec것과 같은 대안을 사용하여 이러한 상황을 피할 준비가 되었습니다 .find ... -print0 | xargs -0 ...

관련 정보