Extrai o nome do arquivo, a contagem da linha do arquivo e o tamanho do arquivo para cada arquivo

0

Perguntando qual é a melhor maneira de capturar as informações de um grupo de arquivos de forma recursiva em uma pasta e registrando-a como um arquivo delimitado por um pipe separado, conforme mostrado abaixo

Exemplo de um arquivo de saída.

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 
    
por user2292524 05.10.2018 / 07:50

2 respostas

0

Sua tag linux sugere que stat e GNU sed estão disponíveis em seu sistema; tente assim

stat -c"%n|%s|%y" SOME_FLD/* | sed -r 'h; s/\|.*$//; s/^/wc -l </e; G; s/\n/|/; s/^([^|]*\|)([^|]*\|)//; 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 lista os campos de dados necessários; sed , depois de salvar a linha no buffer de suspensão, executa o comando wc -l no nome do arquivo (extensão GNU), embaralha os campos relevantes na ordem solicitada e faz alguns cosméticos (remove os campos de hora da data, substitui o / to | pelos caminhos dos liles).

    
por 05.10.2018 / 09:34
0

Com versões recentes de 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;
  }}' {} +

(note que ele pula arquivos vazios e (ao contrário de wc -l ) conta caracteres após a última linha nova como uma linha).

Ou com 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]"
}

Mas isso significa executar um wc -l por arquivo que será bastante ineficiente.

    
por 05.10.2018 / 10:07

Tags