xargs가 여러 명령을 실행합니까?

xargs가 여러 명령을 실행합니까?

을 사용하여 xargs여러 명령을 실행할 수 있습니까? 내가 찾은 유일한 관련 정보질문은 ~이야, 그러나 대답은 와 관련이 없습니다 xargs.

저는 간단하게 운영하고 있어요

du / -ah | sort -r -n | head -n 10 |  awk '{print $2}'

가장 많은 디스크 공간을 차지하는 파일을 찾으십시오. 그러나 삭제하려는 디렉토리도 반환됩니다.문서어떤 구조를 유지하려면.

find파일 크기 대신 디스크 사용량으로 검색할 수 있는지 확실하지 않기 때문에 명령을 사용하는 데 지쳤습니다 .

어떤 조언이라도 대단히 감사하겠습니다!

답변1

find일반 파일을 가져와서 실행하는 데 사용할 수 있습니다 du. 아래 명령은 루트 디렉토리에 이 작업을 수행하면 일부 특수 디렉토리에 대한 불만 사항이 발생할 수 있으므로 표준 오류를 억제합니다. 여기서는 및 에 -h사용되며 파일 크기 표시를 정렬하는 데 유용합니다.dusort

find / -type f -exec du -h {} + 2>/dev/null | sort -hr | head | cut -f2-

개행 문자는 위 명령의 파일 구분 기호로도 사용됩니다. GNU 쉘에 들어가는 안전한 방법은 null 바이트를 사용하여 인수를 구분하는 것입니다. 예를 들면 다음과 같습니다.

find / -type f -exec du -h0 {} + 2>/dev/null | sort -zhr | head -z | cut -zf2- | xargs -r0 <some command to run for the 10 biggest files>

귀하의 경우( /모든 사용자로 검색) 파일과 크기를 인쇄하고 수행할 작업을 결정하십시오. 결과를 에 직접 보내지 마십시오 rm --.

또한보십시오:

답변2

목차많은 유형 중 하나이다문서(일반, 디렉토리, 심볼릭 링크, fifo, 장치...). 아마도 당신 말은일반 파일이는 디스크 공간이 할당되는 디렉터리와 다른 유형의 파일이기 때문입니다.

du / -ah | head -n 10 | sort -r -n | awk '{print $2}'

-h을 사용하면 KMGT... 접미사가 생기기 때문에 잘못된 것입니다. 이는 sort -n작동하지 않음을 의미합니다. GNU 구현에는 이러한 접미사를 디코딩하는 옵션이 sort있지만 -h반올림으로 인해 순서가 여전히 잘못될 수 있습니다.

또한 하드 링크는 한 번만 평가되며 파일 경로에는 텍스트가 아닌 줄 바꿈이 포함될 수 있습니다. awk두 번째 공백으로 구분된 필드를 반환하면 공백이 포함된 파일 경로가 차단된다는 점은 말할 것도 없습니다 . 0은 파일 경로에 나타날 수 없는 유일한 바이트 값이므로 NUL로 구분된 레코드를 사용하여 파일 목록을 표시하려고 합니다.

-hGNU 확장입니다. GNU 구현은 find디스크 사용량을 사용하거나 보고할 수 있으므로 다음을 수행할 수 있습니다.-printf %b-printf %k

find . -type f -printf '%b\t%p\0' |
  sort -zrn |
  numfmt -d $'\t' -z --to=iec --from-unit=512 |
  tr '\0' '\n'

이는 tr사람이 소비할 수 있도록 출력하는 것이므로 이 목록을 사후 처리하려면 NUL로 구분된 형식을 유지해야 합니다. 예를 들어, 디스크 사용량 측면에서 가장 큰 10개의 파일을 삭제하려면 다음을 수행하십시오.

find . -type f -printf '%b\t%p\0' |
  sort -zrn |
  head -zn10 |
  cut -zf 2- |
  xargs -r0 rm -f

( -printf, -z, -r-0모두 GNU 확장이지만 xargs -0현재 일부 다른 구현에서도 지원되며 -r그 정도는 적습니다).

기술적으로는 rm상위 디렉터리에서 파일의 링크를 해제하세요. 파이프라인이 10개의 다른 디렉터리에 연결된 동일한 파일을 반환하는 경우 해당 파일의 연결을 해제할 수 있지만 파일이 여전히 더 많은 디렉터리에 연결되어 있으면 해당 공간을 회수할 수 없습니다.

.상위 10개의 가장 큰 파일 아래 디렉터리에 있는 모든 항목(링크)을 삭제하려면 다음을 수행할 수 있습니다.

find . -type f -printf '%b\t%D:%i\t%p\0' |
  sort -zrn |
  gawk -F'\t' -v RS='\0' -v ORS='\0' '!seen[$2]++ && ++n > 10 {exit}1' |
  cut -zf 3- |
  xargs -r0 rm -f

¹ 다음 유형의 파일의 경우목차du디렉터리 파일 자체의 디스크 사용량뿐만 아니라 목록에 나열된 고유 파일과 해당 반복 하위 디렉터리의 디스크 사용량도 보고합니다.

관련 정보