폴더에 있는 파일 세트의 정보를 재귀적으로 캡처하고 아래와 같이 파이프로 구분된 별도의 파일에 기록하는 가장 좋은 방법이 궁금합니다.
출력 파일의 예.
FOLDER_NM|FILE_NM|FILE_CNT|FILE_SIZE|DATE .
SOME_FLD|xyz|35|350 MB| 10-05-2018
SOME_FLD|abc|10|440 MB| 10-05-2018
SOME_FLD|pqr|85|800 MB| 10-05-2018
SOME_FLD|lmn|40|200 MB| 10-05-2018
답변1
귀하의 linux
태그는 귀하의 시스템에서 stat
GNU를 사용할 수 있음을 나타냅니다.sed
stat -c"%n|%s|%y" SOME_FLD/* | sed -r 'h; s/\|.*$//; s/^/wc -l </e; G; s/\n/|/; s/^([^|]*\|)([^|]*\|)/\2\1/; s/( [^ ]*){2}$//; s#/#|#'
SOME_FLD|abc|235|2808|2018-10-05
SOME_FLD|lnm|235|2808|2018-10-05
SOME_FLD|pqr|235|2808|2018-10-05
SOME_FLD|xyz|235|2808|2018-10-05
stat
필요한 데이터 필드를 나열하고 sed
행을 보유 버퍼에 저장한 후 wc -l
파일 이름(GNU 확장자)에 대해 명령을 실행한 다음 관련 필드를 요청된 순서로 섞은 다음 약간의 다듬기를 수행합니다(날짜에서 시간 필드 제거). , liles의 경로를 to로 /
바꿉니다 .|
답변2
최신 버전을 사용하세요 perl
:
find "$PWD" -type f -exec perl -MPOSIX -MNumber::Bytes::Human=format_bytes -e '
while (<<>>) { if (eof) {
my ($d, $f) = $ARGV =~ m{.*/(.*)/(.*)}s;
my @s = stat ARGV;
print join("|", $d, $f, $., format_bytes(tell ARGV),
strftime("%Y-%m-%d", localtime $s[9])) . "\n";
close ARGV;
}}' {} +
(빈 파일을 건너뛰고 (반대로 wc -l
) 마지막 개행 이후의 문자를 한 줄로 계산합니다.)
또는 다음을 사용하여 zsh
:
#! /bin/zsh -
zmodload zsh/stat
human() {
local suffix
REPLY=$1
for suffix ('' K M G T P E) {
((REPLY<1024)) && break
((REPLY /= 1024.))
}
printf -v REPLY '%.1f%s' $REPLY $suffix
}
for file ($PWD/**/*(D-.)) {
zstat -F %F -H info -- $file &&
lines=$(($(wc -l < $file))) &&
printf '%s\n' "$file:h:t|$file:t|$lines|$info[size]|$info[mtime]"
}
그러나 이는 wc -l
파일당 하나씩 실행한다는 의미이므로 매우 비효율적입니다.