파일 이름, 생성 시간 및 파일 크기(GB)를 사용하여 CSV를 생성합니다.

파일 이름, 생성 시간 및 파일 크기(GB)를 사용하여 CSV를 생성합니다.

다음 명령을 사용하여 많은 하위 디렉터리가 포함된 대규모 디렉터리의 파일 이름, 파일 크기 및 날짜를 ​​추출했습니다.

find MY_PATH -type f -exec ls -la --block-size=GB --time-style=+%Y-%m-%d_%H:%M:%S {} \; | awk  -F " |/" -v OFS=',' '{print $5,$6,$NF;}' > fileName.csv

내가 원하는 것은:

  1. 간단한 이름(예: )을 가진 파일에는 작동 test.gz하지만 [Name] A - A B C_D.zip파일에 복잡한 이름(예: ; )이 있으면 잘 작동합니다. 실패하고 파일 이름의 마지막 부분만 반환합니다.
  2. 이제 날짜는 입니다 . 날짜가 두 개의 새로운 열로 분할되는 것을 방지하기 위해 --time-style=+%Y-%m-%d_%H:%M:%S추가했습니다 . 하지만 대신 _사용하고 싶지만 여전히 날짜를 열로 반환합니다.space_

다음은 디렉토리에 있는 일부 파일의 이름입니다. 이와 같은 디렉토리가 많이 있습니다.

[www.google.com] Learn - Complete SQL and Databases Bootcamp Zero to Mastery 2022.zip
[www.google.com] Learn - MongoDB - The Complete Developer's Guide 2022.zip
[www.google.com] Learn - SQL - The Complete Developer's Guide (MySQL, PostgreSQL).zip
[www.google.com] Learn - The Complete Oracle SQL Bootcamp (2022).zip

예상되는 출력은 CSVcolumns 을 포함하는 파일 입니다 name,size,date.

답변1

find제안된 대로 with 를 사용한 printf다음 첫 번째 필드를 처리하여 바이트를 다음으로 변환합니다.예를 들어

find . -type f -printf '%s %TF %.8TT %p\n' | numfmt --to-unit=1073741824 --format='%.2f GiB'

이는 파일 이름에 개행 문자가 포함되어 있지 않다고 가정합니다. OP에 따라 시간과 크기를 인쇄해야 합니다.소수점 이하 두 자리... 타임스탬프와 크기의 형식을 언제든지 사용자 정의할 수 있습니다. 각각 설명서 find( -printf섹션 참조) 및 numfmt( 참조 --format)를 확인하세요.


앞서 말했듯이 쉼표로 구분하거나 다른 순서로 정렬하려면 형식을 조정하세요.

find . -type f -printf '%f,%s,%TF %.8TT\n' | \
numfmt --delimiter=, --field=2 --to-unit=1073741824 --format='%.2f GiB'

이는 파일 이름에 쉼표가 포함되어 있지 않다고 가정합니다. 이렇게 하면 낮은 ASCII 문자를 구분 기호로 사용하고 다음과 같은 명령을 실행할 수 있습니다.

s=$'\002'
find . -type f -printf "%f,${s}%s${s},%TF %.8TT\n" | numfmt -d${s} --field=2 --to-unit=1073741824 --format='%.2f GiB' | tr -d ${s}

zsh또 다른 방법zstat기준 치수

zmodload zsh/stat
for f in **/*(.D)
do
sz=$(( $(zstat +size $f)/1073741824. ))
mt=$(zstat -F '%F %T' +mtime $f)
printf '%s,%.2f,%s\n' $f:t ${sz} ${mt}
done

%.2f소수점 두 자리 이상(또는 그 이하)을 원할 경우 조정하세요.

관련 정보