내 쉘 엔진은비지박스 1.31.0또는배쉬 3.2
검색된 파일의 크기를 가져와야 합니다.찾다주문하다.
나는 60일 이상 전에 수정된 파일만 찾으려고 노력해 왔으며 모든 파일의 크기를 가져왔습니다(MB 표기법으로 한 줄로 요약하는 것이 좋습니다). 내가 시도한 것은 다음과 같습니다.
find -type f -mtime +60 -print0 | xargs -0 du -smc
그리고
find -type f -mtime +60 -exec du -smc {} \;
전자는 60일보다 오래된 모든 파일을 한 줄씩 검색하지만(여기까지는 문제 없음) 이상하게도 모든 줄 사이에서 크기를 여러 번 계산하고 마지막 줄에는 다음과 일치하지 않는 "총" 크기가 표시됩니다. 실제 출력 총 크기입니다. 이렇게 생겼습니다.
.....
.....
0 ./FOLDER 2018/Copy #183 of ~$DATABASE OTHERS - NOV.18N.xlsx
42 ./FOLDER 2018/F9C8A618.tmp
0 ./FOLDER 2018/Copy #166 of ~$DATABASE PORTFOLIO NOV.18.xlsx
3275 total
10 ./FOLDER 2018/CFDC6981.tmp
2 ./FOLDER 2018/D5AAF4EB.tmp
0 ./LIFE INSURANCE/Copy #15 of ~$Copy of LIFE INSURANCE CLIENTS.xlsx
12 total
후자의 출력은 일치하는 각 파일의 크기를 한 줄씩 계산하지만 전체 크기는 계산하지 않습니다.
내가 찾고 있는 것은:
0 ./FOLDER 2018/Copy #183 of ~$DATABASE OTHERS - NOV.18N.xlsx
42 ./FOLDER 2018/F9C8A618.tmp
0 ./FOLDER 2018/Copy #166 of ~$DATABASE PORTFOLIO NOV.18.xlsx
10 ./FOLDER 2018/CFDC6981.tmp
2 ./FOLDER 2018/D5AAF4EB.tmp
0 ./LIFE INSURANCE/Copy #15 of ~$Copy of LIFE INSURANCE CLIENTS.xlsx
54 total
또는 모든 라인에 대한 실제 크기 결과가 없습니다.
54 total
도움을 주시면 감사하겠습니다.
답변1
find
to의 출력을 파이핑하고 플래그를 du
지정해 보십시오.--files0-from -
find -type f -mtime +60 -print0 | du -shc --files0-from -
마지막에 총계를 제공해야합니다
총계를 얻으려면 출력을 다음으로 파이프하십시오 tail -n1
.
find -type f -mtime +60 -print0 | du -shc --files0-from - | tail -n1
저는 실제로 이것을 busybox가 아닌 gnu linux를 사용하여 테스트했다는 점을 언급하고 싶습니다. 보고 있다바쁜 상자du
페이지에서 이 옵션은 지원되지 않는 것 같습니다 --files0-from
.
위의 명령을 다음과 같이 변경하여 busybox에서 실행되도록 할 수 있습니다.
find -type f -mtime +60 -print0 | xargs -0 du -ch | tail -n1
위 방법은 이름에 공백과 개행 문자가 포함된 파일에도 작동하지만 명령이 너무 많은 파일을 발견하면 제대로 작동하지 않을 수 있습니다 find
. 아래를 참조하세요논평. 파일이 너무 많다고 생각되면 이 페이지에서 다른 답변을 시도해 볼 수 있습니다.
답변2
원칙적으로는 쉽습니다. 여러 파일을 즉시 find
실행하도록 지시하기만 하면 됩니다. du
안타깝게도 명령이 여러 번 실행될 수 있고 매개변수 그룹화만 시도하며 총 길이가 시스템의 명령줄 길이 제한을 초과하는 경우 모든 매개변수를 그룹화할 수 없기 때문에 이 방법은 안정적으로 작동하지 않습니다. 실제로 BusyBox find(적어도 방금 테스트한 버전)는 전혀 그룹화를 시도하지 않습니다. 한 번에 하나의 인수인 line 을 처리합니다. 행을 확보할 수 있는 방법은 없습니다.
find . -type f -mtime +60 -exec du -smc {} +
-exec … {} +
-exec … {} +
-exec … {} \;
total
du
GNU에게 임의로 긴 파일 이름 목록을 읽도록 지시할 수 있지만 --files0-from
, 다른 버전 du
, 특히 BusyBox 버전은 명령줄에서만 파일 이름을 가져올 수 있습니다.
따라서 GNU가 있다고 가정할 수 없다면 GNU를 여러 번 실행하는 것을 du
피할 수 없습니다 du
. 즉, 합계를 계산하기 위한 다른 도구가 필요하며 결과적으로 du
크기를 반올림하지 않아도 됩니다. awk의 출력을 구문 분석할 수 있으면 합산은 간단합니다 du
.
파일 이름에 줄 바꿈이 없다고 가정하거나 줄 바꿈이 포함된 경로를 제외할 수 있는 경우 출력을 du
구문 분석하기 쉽습니다. 한 줄에 파일이 하나만 있습니다.
newline='
'
find . ! -path "*${newline}*" -type f -mtime +60 -exec du -k {} + |
awk '{kB += $1} END {printf "%d MB\n", (kB + 512) / 1024}'
답변3
축적하고 싶다면디스크 사용량(사용법에서 du
알 수 있듯이) 60일보다 오래된 일반 파일은 GNU 및 비지박스 시스템으로만 이식하면 됩니다(비지박스에 포함된 명령과 지원하는 기능은 빌드 시 구성할 수 있으므로 알 수 없음). 하나의 busybox 인스턴스에서 작동하는 메서드가 다음 인스턴스에서도 작동하는지 여부) 다음을 수행할 수 있습니다.
find . -type f -mtime +59 -print0 |
xargs -r0 stat -c '%D:%i %b' | awk '
!seen[$1]++ {sum += $2}
END {print sum * 512}'
-mtime +59
(예, 60 x 24시간보다 오래된 파일이 필요합니다 -mtime +60
. 해당 파일은 60일로 반내림되고 60은 60보다 크지 않기 때문에 60.9일 파일과 일치하지 않습니다.)
총 바이트 수를 보고합니다. 하드 링크(또는 다른 경우, 예:번들 설치(동일한 파일에 대한 경로가 여러 개 있을 수 있음)은 한 번만 평가됩니다(GNU와 마찬가지로 , busybox는 du
하드 링크가 개별 디렉터리 인수 순회에서 발견되지 않고 별도의 인수로 전달되는 경우 du
이를 수행하지 않습니다 ). 그러나 btrfs 와 마찬가지로 btrfs와 같은 파일 시스템에 파일이 복사되거나 파일 시스템이 중복 제거를 수행하는 경우 du
와 같이 하드 링크가 아닌 파일 간에 일부 데이터가 공유되는 상황은 감지하지 못합니다 .cp --reflink=always
이는 GNU 특정 항목과 동일해야 합니다.
find . -type f -mtime +59 -print0 |
du -cB1 --files0-from=- |
awk 'END{print $1}'
POSIXly에서는 모든 파일이 동일한 파일 시스템에 있다고 가정하면 다음을 수행할 수 있습니다.
LC_ALL=C LS_BLOCK_SIZE=512 BLOCKSIZE=512 POSIXLY_CORRECT=1 \
find . -type f -mtime +59 -exec ls -nisqd {} + | awk '
!seen[$1]++ {sum += $2}
END {print sum * 512}'
( GNU와 같은 일부 구현은 LS_BLOCK_SIZE=512 BLOCKSIZE=512 POSIXLY_CORRECT=1
기본적으로 POSIX와 호환되지 않는다는 사실을 해결하기 위해. 이를 지원하지 않는 busybox에서는 작동 하지 않습니다 . 그러나 항상 파일 경로에 개행 문자를 렌더링하기 때문에 (이 역시 POSIX와 호환되지 않습니다) , 거기에는 필요하지 않습니다).ls
ls
ls
-q
?
-q
그 후(여기서는 GNU 시스템에서):
$ seq 10000 > a
$ truncate -s14T a
$ ln a b
$ touch -d '-60 days' a
$ BLOCKSIZE=1 ls -lis --full-time
total 98304
59944369 49152 -rw-rw-r-- 2 me me 15393162788864 2019-07-29 09:49:25.933 +0100 a
59944369 49152 -rw-rw-r-- 2 me me 15393162788864 2019-07-29 09:49:25.933 +0100 b
$ date --iso-8601=s
2019-09-27T09:50:03+01:00
$ du -h
52K .
나에게 주어진 모든 49152
것은 두 가지의 누적 디스크 사용량이지만 a
크기 b
(28TiB)의 합이나 디스크 사용량 크기(49152 x 2)와는 다릅니다.
(위의 52K에는 현재 디렉터리 파일의 디스크 사용량도 포함됩니다( .
내 경우에는 4KiB).
겉보기 치수의 합입니다.
find . -type f -mtime +59 -print0 |
xargs -r0 stat -c %s | awk -v sum=0 '
{sum += $0}; END{print sum}'
또는 GNU를 사용하십시오 du
:
find . -type f -mtime +59 -print0 |
du -cbl --files0-from=- |
awk 'END{print $1}'
또는 POSIXly(단일 파일 시스템에는 제한이 없음):
LC_ALL=C find . -type f -mtime +59 -exec ls -nqd {} + |
awk -v sum=0 '{sum += $5}; END {print sum}'
위의 예에서는 둘 다 30786325577728
(28TiB)를 제공합니다.