* *와 파이프의 차이점

* *와 파이프의 차이점

특정 디렉토리에 있는 모든 파일의 크기를 확인하고 싶다고 가정해 보겠습니다.

내가 한 일은 다음과 같습니다.

du -sh *

또는 다음과 같이 할 수 있습니다.

ls | xargs du -sh

이 두 명령은 완전히 동일한 작업을 수행합니다.

비용, 효율성 등이 정확히 동일한지 알고 싶습니다. (첫 번째 명령이 두 번째 명령보다 가벼운 것 같나요?)

답변1

하나는 맞고, 다른 하나는 틀립니다.

du -sh *

( du -sh -- *파일 이름이 다음으로 시작하는 문제는 피해야 합니다 -)

glob 을 확장하려면 쉘을 사용하십시오 *. du현재 디렉토리에 있는 숨겨지지 않은 모든 파일과 디렉토리를 별도의 인수로 처리하십시오. 특수 문자를 올바르게 처리합니다.

ls | xargs du -sh

xargs프로세스 의 출력 에 따라 다릅니다 ls. xargs입력을 공백(일부 구현에서는 공백, 탭 및 줄 바꿈, 일부 구현에서는 더 많음)으로 분할하고, 일부 형태의 인용도 이해하며, du공백으로 구분된 각 문자열(빈 입력인 경우에도) 또는 여러 호출을 사용하여 (한 번) 개별적으로 실행합니다. 인수.

현재 디렉터리에 이름에 공백, 작은따옴표, 큰따옴표 또는 백슬래시 문자가 포함된 파일이 없고 xargs단 한 번의 호출을 실행du

효율성 측면에서 du -sh *하나의 프로세스를 사용하거나 ls | xargs du -sh적어도 세 개의 프로세스를 사용하십시오. 파이프 방법이 작동하지만 glob은 작동하지 않는 경우가 있습니다. 현재 디렉토리에 파일이 너무 많으면 쉘은 du모든 파일 이름을 한 번에 실행 하지 않고 필요한 만큼 여러 번 xargs계산 합니다. du이 경우에는 여러 줄이 표시되며 여러 하드 링크가 있는 파일은 여러 번 계산될 수 있습니다.

당신은 또한 볼 수 있습니다왜 `ls`를 구문 분석하지 *않나요*?


1 현재 디렉토리에 숨겨지지 않은 파일이 없으면 du -sh -- *쉘은 오류와 함께 실패하거나 일부 쉘(예: bash리터럴을 인수로 사용하여 실행되는 쉘)은 파일이 존재하지 않는다고 불평합니다. 사용되기는 하지만 대부분의 구현(일부 BSD 제외)은 인수 없이 실행되므로 현재 디렉터리의 디스크 사용량(따라서 디렉터리 파일 자체와 그 안에 있는 모든 숨겨진 파일 및 디렉터리의 디스크 사용량도 제공)을 제공합니다.du*du*

ls | xargs du -sh --xargsdu

답변2

첫 번째 경우, 쉘은 *일치하는 파일 이름 목록으로 확장하고 이를 du명령에 인수로 전달합니다. 두 번째 경우, 쉘은 ls파이프를 통해 연결된 두 프로세스( 및 )를 시작합니다. 파일 이름을 인쇄하고 읽은 다음 명령을 시작하십시오. 따라서 두 번째 버전은 3개의 명령을 실행하고 첫 번째 버전은 하나만 실행합니다. 몇 가지 잠재적인 차이점이 있습니다.xargslsxargsdu

  • ls파일이 다른 순서로 나열될 수 있습니다.
  • 환경 설정에 따라 ls나열되는 파일이 더 많거나 적을 수도 있습니다(확실하지는 않음).
  • xargs인수로 전달할 수 있는 것보다 더 많은 파일 이름이 수신되면 여러 du번 실행됩니다.

관련 정보