내 목표는 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
거대한 크기를 잘못 보고하는 희소 파일이기 때문에 무시됩니다(즉, 디스크 가득 참 문제를 일으키지 않음).
-printf
GNU 조회에만 해당됩니다. 이 경우 파일 크기(바이트)와 파일의 전체 경로가 인쇄됩니다.
실제로 명령 이후의 모든 내용을 유지할 수 있습니다 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