다음 명령을 사용하여 많은 하위 디렉터리가 포함된 대규모 디렉터리의 파일 이름, 파일 크기 및 날짜를 추출했습니다.
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
내가 원하는 것은:
- 간단한 이름(예: )을 가진 파일에는 작동
test.gz
하지만[Name] A - A B C_D.zip
파일에 복잡한 이름(예: ; )이 있으면 잘 작동합니다. 실패하고 파일 이름의 마지막 부분만 반환합니다. - 이제 날짜는 입니다 . 날짜가 두 개의 새로운 열로 분할되는 것을 방지하기 위해
--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
예상되는 출력은 CSV
columns 을 포함하는 파일 입니다 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
소수점 두 자리 이상(또는 그 이하)을 원할 경우 조정하세요.