모든 하위 디렉터리의 파일 이름과 파일 크기를 반복적으로 출력하시겠습니까?

모든 하위 디렉터리의 파일 이름과 파일 크기를 반복적으로 출력하시겠습니까?

내 목표는 Linux 시스템에 있는 각 파일의 파일 크기(MB 또는 GB 단위)를 측정하고, 파일 이름과 파일 크기를 재귀적으로 기록하고, 출력을 탭으로 구분된 텍스트 파일로 파이프하는 것입니다.

이에 대한 적절한 명령은 무엇입니까?

다음과 같은 명령을 시도해 볼 수 있습니다.

ls -lhR > outputfile.txt

그러나 나는 이것이 매우 비효율적이라고 생각하는 이유가 있습니다.

http://mywiki.wooledge.org/ParsingLs

for 루프를 사용하는 것이 더 적절할까요?

답변1

sudo du -h / 2>/dev/null > out.csv
  • sudo모든 파일을 읽었는지 확인하는 데 사용됩니다 .
  • -h그리고 사용 du은 "시간사람이 읽을 수 있는" 크기 형식입니다.
  • 오류를 표시하지 않음( 2>/dev/null, 2표준 오류는 어디에 있습니까?)
  • 결과를 파일( > out.csv)로 보냅니다.

그러면 값 사이에 탭 문자가 포함된 파일 크기와 경로가 포함된 목록이 생성됩니다.

답변2

이것을 시도해 보세요(GNU find와 파일 이름에 큰따옴표 문자가 포함되어 있지 않다고 가정):

{
    printf '%s\t%s\n' size path
    find / \( -path /proc -o -path /sys \) -prune -o -printf '%s\t"%P"\n' |
        numfmt --to=iec
} > outputfile.csv

확인하다

man find | less +/'-printf format'

또는

info --ind=-printf find

답변3

참고: 아래 명령은 귀하가 요청한 것보다 조금 더 복잡하지만 다른 사람들에게는 매우 유용할 수 있습니다.


다음은 동료들과 함께 개발하여 전체 디스크를 처리해야 하는 애플리케이션 지원 팀에 제공하는 명령입니다.

find / -xdev \! -path /var/log/lastlog -printf '%s\t%p\n' | sort -rn | head | cut -f2- | xargs -n1 ls -lh | awk '{print $5, $NF}'

다음은 더 쉽게 읽을 수 있도록 줄 바꿈을 사용한 동일한 명령입니다.

find / -xdev \! -path /var/log/lastlog -printf '%s\t%p\n' |
  sort -rn | head | cut -f2- |
  xargs -n1 ls -lh | awk '{print $5, $NF}'

이 명령은 각 파일의 사람이 읽을 수 있는 파일 크기와 함께 루트 파일 시스템에서 가장 큰 10개의 파일을 인쇄합니다.

이 명령을 실행해야 합니다루트 사용자로정확한 결과를 얻으려면.

-xdev파일 시스템 경계를 통과하지 마십시오. 이는 NFS가 느려질 가능성이 있는 경우 중요합니다.

/var/log/lastlog거대한 크기를 잘못 보고하는 희소 파일이기 때문에 무시됩니다(즉, 디스크 가득 참 문제를 일으키지 않음).

-printfGNU 조회에만 해당됩니다. 이 경우 파일 크기(바이트)와 파일의 전체 경로가 인쇄됩니다.

실제로 명령 이후의 모든 내용을 유지할 수 있습니다 head. 손실되는 유일한 것은 사람이 읽을 수 있는 파일 크기입니다.

따라서 다음 접근 방식이 가능합니다.

find / -xdev \! -path /var/log/lastlog -printf '%s\t%p\n' | sort -rn | head

이 명령확실히파일 이름에 개행 문자가 포함된 경우에 작동합니다. 그러나 이 명령은 운영자가 수동으로 처리하기 위한 것이므로(스크립트에서 사용하기 위한 것이 아님) 이는 중요하지 않습니다.


이제 특정 질문에 대답하려면 다음을 수행하십시오.

내 목표는 Linux 시스템에 있는 각 파일의 파일 크기(MB 또는 GB 단위)를 측정하고, 파일 이름과 파일 크기를 재귀적으로 기록하고, 출력을 탭으로 구분된 텍스트 파일로 파이프하는 것입니다.

MB 또는 GB 요구 사항은 무시하고 파일 크기만 바이트 단위로 보고하겠습니다. 이는 매우 쉽기 때문입니다. 꼭 필요한 경우 위의 명령을 참조하여 수행 방법을 알아보세요.

sudo find / -printf '%s\t%p\n' > outputfile.txt

답변4

GNU를 사용 stat하고 다음을 수행하십시오 bash globstar.

shopt -s globstar
stat --printf="%s\t%n\n" -- ** | numfmt -d $'\t' --to=iec >out.csv

여기에는 디렉터리가 포함되지만 파일이기도 합니다.

@Patrick이 지적했듯이 다음으로 인해 문제가 발생할 수 argument list too long있습니다 **.find

sudo find / -type f -exec stat --printf="%s\t%n\n" -- {} \; | numfmt -d $'\t' --to=iec

관련 정보