Conversão DateFormat

1

Estou tentando cortar as três colunas usando o comando awk.

-rwxrwxr-x 1 rouser users 33 Oct 19 05:20 b.sh

Estou usando esta linha abaixo para cortar os valores de 33 de outubro de 19 05:20.

z='ls -l b.sh | awk '{print $6,$7,$8 }''
echo $z

z dará o resultado como 33 out 19 05:20.

Qual é a minha pergunta, quero data, mês, ano neste formato 19/10/2016.
o que devo fazer?
gentilmente me ajude o quanto antes.

    
por ameer 09.11.2016 / 07:42

2 respostas

2

Algumas notas sobre a análise de ls output:

  • o formato depende da localidade. Se você precisar analisá-lo, precisará corrigir o código de idioma para algo conhecido, normalmente C
  • na saída ls -l , já que o nome de usuário e o nome do grupo aparecem antes da data e podem conter espaços (na prática, raros), você não pode contar com a data estando sempre no 6º campo. É melhor usar ls -n para usar uid / gid numérico (ou -o , -g com implementações que os tenham).
  • se o arquivo for do tipo diretório, ls -l file listaria seu conteúdo. Você quer a opção -d ( LC_ALL=C ls -nd -- "$file" até agora).
  • se o nome do arquivo (ou o alvo do symlink para arquivos do tipo symlink) contiver caracteres de nova linha, então você precisa ter certeza de considerar apenas a primeira linha da saída

    LC_ALL=C ls -nd -- "$file" | awk '{print $6,$7,$8; exit}'
    
  • Na localidade C, o formato do horário de modificação varia dependendo se o arquivo foi modificado pela última vez nos últimos 6 meses ou não (ou no futuro). Assim, você pode obter Jun 14 09:18 ou Feb 4 2014 ou Jan 1 2017 se for executado em 2016-11-09. Se um ano não é dado, então você não pode assumir que o ano é o ano atual. Por exemplo, se você executá-lo em janeiro e receber um Dec 24 23:59 , será em dezembro do ano passado.

Ainda é possível trabalhar como:

LC_ALL=C ls -dn -- "$file" | awk -v now="$(date +%m:%Y)" '{
  m=$6; d=$7; y=$8
  m = index("--JanFebMarAprMayJunJulAugSepOctNov", m) / 3
  if (y ~ /:/) {
    split(now, a, ":")
    y = a[2]
    if (m > a[1]) y--
  }
  printf "%02d/%02d/%04d\n", d, m, y
  exit}'

Mas o melhor seria ter o tempo no formato certo desde o início. Com zsh , você pode usar seu stat builtin:

zmodload zsh/stat
stat -LF %d/%m/%Y +mtime -- $file

Em um sistema GNU, você pode fazer:

date -r "$file" +%d/%m/%Y

(embora para links simbólicos, você tenha a hora de modificação do alvo).

ou:

find -- "$file" -prune -printf '%Td/%Tm/%TY\n'

em BSDs:

stat -t %d/%m/%Y -f %Sm -- "$file"

Ou usando perl para portabilidade:

perl -MPOSIX -le '@s = lstat shift or die "lstat: $!";
  print strftime "%d/%m/%Y", localtime $s[9]' -- "$file"
    
por 09.11.2016 / 17:53
0

Se você quiser usar ls , você pode fazer isso: ls -l --time-style=+%d/%m/%Y

    
por 09.11.2016 / 07:58