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 usarls -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
ouFeb 4 2014
ouJan 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 umDec 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"