사진이 많이 담긴 카탈로그가 있어요. 구체적으로는 du -sh --apparent-size /path/to/myfolder
331G를 받았습니다. 정말 대단해요. 하지만 이제 목록을 월별로 그룹화하고 싶습니다. 예를 들면 다음과 같습니다.
2016-01 20MB
2016-02 520MB
2016-03 312MB
...
Linux 내장 기능을 사용하여 이를 수행할 수 있는 (합리적인) 방법이 있습니까, 아니면 이를 수행하기 위해 Python 유틸리티를 직접 작성해야 합니까?
답변1
Linux에서는 다음을 시도해 보세요.
find /my/path -maxdepth 1 -type f -printf '%TY-%Tm %s\n' | awk '{b[$1]+=$2} END{for (date in b) print date, b[date]}' | sort
어떻게 작동하나요?
find /my/path
/my/path에서 파일을 찾습니다.
-maxdepth 1
이는
find
하위 디렉토리를 조사하지 말 것을 의미합니다. (재귀적으로 검색하려면 이 옵션을 무시하세요.)-type f
이는
find
검색을 일반 파일로 제한함을 나타냅니다.-printf '%TY-%Tm %s\n'
이는
find
연도와 월을 인쇄한 다음 각 파일의 크기를 바이트 단위로 인쇄하도록 지시합니다.사용하지 않기 때문에 발견된 파일의 이름은 인쇄되지 않습니다.
b[$1]+=$2
발견된 각 파일에 대해 2열에 있는 바이트 수를 연관 배열의 해당 연도-월 조합에 대한 수에 추가합니다
b
.END{for (date in b) print date, b[date]}
모든 출력을 처리한 후
find
결과를 인쇄합니다.sort
그러면 날짜순으로 결과가 정렬됩니다.
여러 줄 버전
코드를 여러 줄에 걸쳐 분산시키려는 경우:
find /my/path -maxdepth 1 -type f -printf '%TY-%Tm %s\n' |
awk '
{
b[$1]+=$2
}
END{
for (date in b)
print date, b[date]
}
' | sort
예
다음 파일이 포함된 디렉터리를 고려해 보겠습니다.
$ ls -l
total 27816
-rw------- 1 john1024 john1024 2459173 Nov 23 2015 img100.jpg
-rw------- 1 john1024 john1024 3479750 Nov 23 2015 img101.jpg
-rw------- 1 john1024 john1024 4028939 Nov 23 2015 img102.jpg
-rw------- 1 john1024 john1024 2928519 Jul 30 18:55 img103.jpg
-rw------- 1 john1024 john1024 2948294 Jul 30 18:55 img104.jpg
-rw------- 1 john1024 john1024 3177583 Aug 1 16:56 img105.jpg
-rw-rw---- 1 john1024 john1024 3111737 Apr 18 2016 img106.jpg
-rw-rw---- 1 john1024 john1024 1441310 Apr 18 2016 img107.jpg
-rw-rw---- 1 john1024 john1024 2430158 Apr 25 16:26 img108.jpg
-rw-rw---- 1 john1024 john1024 2424504 Apr 25 16:26 img109.jpg
명령의 출력은 다음과 같습니다.
$ find . -maxdepth 1 -type f -printf '%TY-%Tm %s\n' | awk '{b[$1]+=$2} END{for (date in b) print date, b[date]}' | sort
2015-11 9967862
2016-04 9407709
2016-07 5876813
2016-08 3177583
개선하다
바이트 대신 메가바이트(MiB) 단위로 출력하려면 다음과 같이 단위를 변환하면 됩니다.
$ find . -maxdepth 1 -type f -printf '%TY-%Tm %s\n' | awk '{b[$1]+=$2} END{for (date in b) print date, b[date]/1024**2, "MiB"}' | sort
2015-11 9.50609 MiB
2016-04 8.97189 MiB
2016-07 5.60457 MiB
2016-08 3.03038 MiB
를 사용하면 출력 형식을 더 잘 제어할 수 있습니다 printf
. 여기서는 소수점 이하 자릿수 하나만 유지하기 위해 다음 형식을 사용하여 크기 형식을 지정합니다 %5.1f
.
$ find . -maxdepth 1 -type f -printf '%TY-%Tm %s\n' | awk '{b[$1]+=$2} END{for (date in b) printf "%s %5.1f MiB\n", date, b[date]/1024**2}' | sort
2015-11 9.5 MiB
2016-04 9.0 MiB
2016-07 5.6 MiB
2016-08 3.0 MiB