Qualquer método melhor que este para ordenar arquivos pela sua data de criação?

2

Eu precisava exibir uma lista de diretórios organizados por sua data de criação e criei este snippet de código que achei inteligente. Existe uma maneira mais óbvia de fazer isso que estou perdendo?

printf "%-20s\t\t\t%-s\n" "DATE" "CASE"
printf "%-20s\t\t\t%-s\n" "----" "----"

find $idir -mindepth 3 -maxdepth 3 -type d -printf "%T@ %Tc\t\t%p\n" \
     | sed "s#${idir}/##" \
     | sort -h \
     | sed "s#^[^ ]* ##"

Saída de amostra

DATE                                    CASE
----                                    ----
Fri 06 Sep 2013 11:17:41 AM EDT         dir1/Baseline/2013_09_06_11_16_10
Fri 06 Sep 2013 01:44:38 PM EDT         dir2/Baseline/2013_09_06_13_42_48
Sun 08 Sep 2013 05:02:46 PM EDT         dir3/6 Month/2013_09_08_17_02_05
Fri 13 Sep 2013 02:28:30 PM EDT         dir4/Baseline/2013_09_13_14_25_09

Detalhes

O texto acima terá exatamente 3 diretórios no diretório $idir . Em seguida, imprime o tempo de criação de todos os diretórios localizados nessa profundidade. Em seguida, retiro a parte $idir do caminho da saída (não preciso disso), classifico-a e, em seguida, retiro a parte %T@ da saída. Isso foi apenas para que eu pudesse classificar mais facilmente a saída.

Sem o sed à direita, a saída é assim:

DATE                                    CASE
----                                    ----
1378480661.2612650000 Fri 06 Sep 2013 11:17:41 AM EDT           dir1/Baseline/2013_09_06_11_16_10
1378489478.3223970000 Fri 06 Sep 2013 01:44:38 PM EDT           dir2/Baseline/2013_09_06_13_42_48
1378674166.7427782000 Sun 08 Sep 2013 05:02:46 PM EDT           dir3/6 Month/2013_09_08_17_02_05
1379096910.4431689000 Fri 13 Sep 2013 02:28:30 PM EDT           dir4/Baseline/2013_09_13_14_25_09

Mostrando-me um método mais limpo!

    
por slm 10.10.2013 / 02:52

1 resposta

4

Não há um método bom e portátil para classificar os arquivos pelo tempo deles. Os métodos mais portáteis são:

  • Se você puder assumir que os nomes de arquivos contêm apenas caracteres imprimíveis, chame ls -ltd .
  • Caso contrário, use perl.

Este é o método clássico para ordenar arquivos por data com ferramentas GNU. Você está assumindo que os nomes dos arquivos não contêm nova linha; isso é facilmente corrigido alterando \n para sort e chamando -z com a opção sed . Ah, e soltar a rotunda $idir chamadas; Tenha em atenção que o seu script não funcionará se #*^$\[ contiver qualquer om , porque sed irá interpretá-los como caracteres especiais.

cd "$idir" &&
find -mindepth 3 -maxdepth 3 -type d -printf '%T@ %Tc\t\t%p
files=(*(om))
echo "The oldest file is $files[-1]"
' | sort -hz | tr '
zmodload zsh/stat
describe () {
  typeset -A st
  zstat -s -H st "$REPLY"
  echo "$st[mtime] $REPLY"
}
: */*/*(/+describe)
\n' '\n
cd "$idir" &&
find -mindepth 3 -maxdepth 3 -type d -printf '%T@ %Tc\t\t%p
files=(*(om))
echo "The oldest file is $files[-1]"
' | sort -hz | tr '
zmodload zsh/stat
describe () {
  typeset -A st
  zstat -s -H st "$REPLY"
  echo "$st[mtime] $REPLY"
}
: */*/*(/+describe)
\n' '\n%pre%' | sed 's/^[^ ]* //'
' | sed 's/^[^ ]* //'

A propósito, você está classificando arquivos pelo tempo de modificação, não pelo tempo de criação. A maioria das variantes unix que não sejam o OSX não suportam tempos de criação até o fim (do sistema de arquivos através do kernel até as ferramentas userland).

A maneira fácil e limpa de classificar arquivos pelo tempo de modificação é usar zsh. O qualificador de glob Om classifica os arquivos em idade crescente (use zstat para obter o arquivo mais antigo primeiro).

%pre%

Para obter resultados como o que você mostra, use %code% .

%pre%     
por 10.10.2013 / 03:09