각 파일의 파일 이름, 파일 줄 수 및 파일 크기를 추출합니다.

각 파일의 파일 이름, 파일 줄 수 및 파일 크기를 추출합니다.

폴더에 있는 파일 세트의 정보를 재귀적으로 캡처하고 아래와 같이 파이프로 구분된 별도의 파일에 기록하는 가장 좋은 방법이 궁금합니다.

출력 파일의 예.

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태그는 귀하의 시스템에서 statGNU를 사용할 수 있음을 나타냅니다.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파일당 하나씩 실행한다는 의미이므로 매우 비효율적입니다.

관련 정보