파일 수와 크기가 포함된 디렉토리 목록을 얻는 가장 쉬운 방법은 무엇입니까

파일 수와 크기가 포함된 디렉토리 목록을 얻는 가장 쉬운 방법은 무엇입니까

내가 원하는 것은 디렉토리를 반복하고 하위 디렉토리에 대한 정보를 매우 특정한 형식으로 출력하여 사용자에게 적합하고 나중에 awk, 및 grep와 같은 도구를 사용하여 구문 분석할 수도 있도록 하는 것입니다 sed.

이는 bash 스크립트의 함수 내에서 실행되고 사용자 터미널에 인쇄됩니다. 유언장 과 비슷 ls하지만 특정 열, 순서 및 필드가 있습니다. 그 위에 함수를 다시 실행하고 awk관심 있는 디렉터리만 캡처하는 등의 작업으로 파이프한 다음 diff해당 디렉터리에 대해 다른 작업을 실행하겠습니다.

~/Parent/2017
Directory Name    Size       Last Modified     Number of Files                 
2017-08-25        1.9 GB     Aug 30   16:39    141
2017-08-26        152 MB     Aug 27   12:57    48
2017-08-29        5.9 GB     Aug 30   7:19     462
2017-08-30        102 MB     Sep 2    14:36    20
2017-08-31        2.0 GB     Sep 1    9:18     148
2017-09-01        1.2 GB     Sep 5    10:21    89

Parent디렉토리가 다음과 같을 때

> ls -l ~/Parent/
2015
2016
2017
Backups
Catalog-file.data
'Temporary Folder DE2B14BB-1052-4FF0-B4E7-B94C0E3CC6F8'
backup-logs
rsync.log

지금까지 나는 이런 것을 가지고 있습니다

  IFS=$'\n';
  for d in `find -maxdepth 1 -type d | grep -P "\d{4}" | grep -v -P "[a-z]+"`; do
    for sd in `find ${d} -maxdepth 1 -type d`; do
      file_count=`ls -lh ${sd} | wc -l`
    done
    ls -lh ${d} | awk -v fc="$file_count" '{printf "%-13s %-8s %-5s %-5s %-8s %-8s \n", $8, $4, $5, $6, $7, fc}'
  done

나는 그것이 제대로 작동하지 않는다는 것을 알고 있습니다. 방금 지금까지 가지고 있는 코드를 제공했는데 당황스럽습니다. file_count각 출력 라인에 대해 변수()를 저장하는 방법은 무엇입니까 awk? 참고: ls"크기" 열을 변수로 바꾸 려면 이 정보가 필요할 수 있습니다 .du -sh directory_name

일반적으로 문제를 계속 해결해 나갈 수 있습니다. 하지만 그 지점에 도달했을 때 아마도 어려운 방법으로 해냈을 수도 있고 더 쉬운 방법이 있을 수도 있다고 생각했습니다. 어떻게 생각하나요? 그러한 사이클이 두 개 있습니까? 아니면 더 쉬운 방법이 있나요?

답변1

GNU 도구를 사용하면 다음을 수행할 수 있습니다.

find . \( -path './*/*' -o -type d \) -printf '%TF %TH:%TM/%s/%p\0' |
  gawk -F/ -v 'RS=\0' '
    BEGIN{split("K/M/G/T/P/E/Z/Y", u)}
    function h(n, i) {
      while (n >= 1024) {n /= 1024; i++}
      return sprintf("%.4g%s", n, u[i])
    }
    {s[$4] += $2; n[$4]++}
    NF == 4 {t[$4] = $1}
    END{
      PROCINFO["sorted_in"] = "@ind_str_asc"
      for (d in t) printf "%-13s %-8s %s %s\n", d, h(s[d]), t[d], n[d]
    }'

즉, 수량과 누적을 계산하는 것입니다.확실히반복적으로 디렉터리에 있는 모든 파일의 크기(디스크 사용량 아님)(더 깊은 파일을 고려하지 않으려면 하나 추가) -maxdepth 2. find디스크 사용량의 경우 블록 수를 계산하고 하드링크를 한 번만 계산하면 더 복잡해집니다.

답변2

스크립트의 특정 부분에 대한 findGNU 명령의 작동에 익숙하십니까 -printf? 현재 수행 중인 작업에 따라 파일 정보 표시를 맞춤화할 수 있습니다. 파일 검색과 표시를 모두 수행하면 스크립트를 단순화할 수 있습니다.

이 명령의 유연성을 설명하려면 다음을 수행하십시오.

find -name '*.sh' -printf 'Script %P last accessed on %D at %r. Owned by %u with permissions set to %M'

...비슷한 결과...

Script foo.sh last accessed on 03/01/17 at 10:15 PM. Owned by joe.blow with permissions set to -rwx-r-x-r-x
Script bar.sh last accessed on 03/22/17 at 02:42 AM. Owned by joe.blow with permissions set to -rw--r---r--

생각할 수 있는 거의 모든 파일 속성에 대해 약 30가지의 서로 다른 지시어가 있으며 날짜 형식은 이를 기반으로 하므로 strftime매우 강력하고 유연합니다. 이러한 플래그에는 왼쪽/오른쪽 정렬, 최소 숫자 너비 등과 같은 일반적인 수정자도 있습니다.

관련 정보