exibe metadados do arquivo em colunas formatadas

1

Eu preciso exibir os metadados do arquivo do diretório atual no formato abaixo.

A primeira coluna deve estar alinhada à esquerda, segunda centrada e terceira à direita alinhada à extremidade direita da tela do terminal.

    
por Akki 04.09.2018 / 14:22

1 resposta

3

Com o GNU find (possivelmente disponível como gfind no seu sistema):

find . -mindepth 1 -maxdepth 1 -printf '%-58P %TF %AF\n'

Imprime o nome do arquivo, a data da última modificação (data de criação do conteúdo do arquivo, se desejar) e a data do último acesso no formato AAAA-mm-dd.

Para restringir a .txt e .bkp arquivos não acessados nos últimos 365 dias:

find . -mindepth 1 -maxdepth 1 \
  \( -name '*.txt' -o -name '*.bkp' \) \
  -atime +364 -printf '%-58P %TF %AF\n'

As colunas devem estar alinhadas, desde que os nomes de arquivo não contenham caracteres de controle ou de byte múltiplo ou de largura zero ou de largura dupla e não tenham mais de 58 bytes.

A primeira coluna é alinhada à esquerda, terceira à direita (assumindo um terminal de 80 colunas), a segunda é deslocada para a direita para deixar espaço para os nomes dos arquivos. Ajuste a largura e o espaçamento do nome do arquivo se você realmente quiser centralizá-lo.

Observe que a lista de arquivos não está classificada.

Com ast-open ls (ou o ls incorporado do ksh93 se construído com ele):

ls -AZ '%-58(name)Ls %(mtime:%F)s %(atime:%F)s'

Deve-se preservar o alinhamento para caracteres de múltiplos bytes, largura zero e largura dupla e classificar a lista.

com zsh :

#! /bin/zsh -
zmodload zsh/stat
for f (*(DN)) {
  stat -LH s -F %F -- $f &&
    printf '%-58s %s %s\n' $f $s[mtime] $s[atime]
}

Para restringir a .txt e .bkp arquivos não acessados nos últimos 365 dias, substitua *(DN) por *.(txt|bkp)(DNa+364) .

Deve-se preservar o alinhamento para caracteres de múltiplos bytes e classificar os nomes dos arquivos.

Como não há um comando padrão para recuperar a modificação e o tempo de acesso de maneira confiável, portualmente, como sempre, sua melhor aposta pode ser usar perl :

perl -MPOSIX -Mlocale -Mopen=locale -MEncode::Locale -MEncode -e '
  opendir D, "." || die "open .: $!\n";
  for (
    sort {$a->[1] cmp $b->[1]}
      map {[$_, decode(locale => $_)]}
      grep {!/^\.{1,2}\z/}
      readdir D
  ) {
    if (@s = lstat$_->[0]) {
      printf("%-58s %s %s\n", $_->[1],
        map {strftime("%Y-%m-%d", localtime $_)} ($s[9], $s[8]))
    } else {warn "$_: $!\n"}
  }'

Assim como a abordagem zsh , ela deve preservar o alinhamento para caracteres de multibyte e classificar os nomes de arquivo de acordo com a ordem de ordenação de localidade.

Como o Solaris 10 vem com uma versão antiga de perl , talvez seja necessário desistir do suporte a caracteres não-ASCII em nomes de arquivos, o que simplificaria:

perl -MPOSIX -e '
  opendir D, "." || die "open .: $!\n";
  for (sort grep {!/^\.{1,2}\z/} readdir D) {
    if (@s = lstat$_) {
      printf("%-58s %s %s\n", $_,
        map {strftime("%Y-%m-%d", localtime $_)} ($s[9], $s[8]))
    } else {warn "$_: $!\n"}
  }'

Para restringir a .txt e .bkp arquivos não acessados nos últimos 365 dias, substitua !/^\.{1,2}\z/ por /\.(txt|bkp)\z/ && -A > 365

    
por 04.09.2018 / 14:39