검색된 파일의 정확한 크기를 출력으로 가져옵니다.

검색된 파일의 정확한 크기를 출력으로 가져옵니다.

내 쉘 엔진은비지박스 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

findto의 출력을 파이핑하고 플래그를 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

duGNU에게 임의로 긴 파일 이름 목록을 읽도록 지시할 수 있지만 --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와 호환되지 않습니다) , 거기에는 필요하지 않습니다).lslsls-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)를 제공합니다.

관련 정보