사진이 많은 디렉토리가 있습니다. 구체적으로, du -sh --apparent-size /path/to/myfolder
331G를 제공합니다. 어느 것이 좋습니다. 그러나 이제는 다음과 같이 월별로 그룹화 된 목록을 얻고 싶습니다.
2016-01 20MB
2016-02 520MB
2016-03 312MB
...
리눅스 내장으로 이것을 할 수있는 합리적인 방법이 있습니까? 아니면 직접 파이썬 유틸리티를 작성해야합니까?
사진이 많은 디렉토리가 있습니다. 구체적으로, du -sh --apparent-size /path/to/myfolder
331G를 제공합니다. 어느 것이 좋습니다. 그러나 이제는 다음과 같이 월별로 그룹화 된 목록을 얻고 싶습니다.
2016-01 20MB
2016-02 520MB
2016-03 312MB
...
리눅스 내장으로 이것을 할 수있는 합리적인 방법이 있습니까? 아니면 직접 파이썬 유틸리티를 작성해야합니까?
답변:
리눅스에서는 다음을 시도하십시오.
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 (Mibibytes) 단위로 원하는 경우 다음과 같이 단위를 변환 할 수 있습니다.
$ 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
printf "%s %9d\n", date, b[date]
대신 print date, b[date]
번째 열 공간 패딩을 추가
printf
.
find
그 지원 을 가지고 있다면 아마도 그 지원 -maxdepth
을 가지고 있을 것 [g]awk
입니다PROC_INFO["sorted_in"]="@ind_str_asc"