Diretório “recursivo” data da última modificação

4

Eu gostaria de saber um comando ou função no linux bash para obter o timestamp (e talvez formatar sua saída) do último arquivo modificado dentro de um diretório.

Digamos que eu tenha / path / mydir e esse diretório tenha muitos arquivos dentro dele. Dado o seu caminho, quero mostrar o registro de data e hora do arquivo modificado mais recente.

Eu acho que o procedimento poderia ser fazer um arquivo foreach recursivo, verificar todos eles e atualizar uma variável com o tempo mais recente sempre que um mais recente for encontrado.

Edit: Desculpe pela confusão, mas eu queria intencionar o timestamp da época:)

    
por user3450548 28.12.2017 / 20:28

4 respostas

4

Uma opção: use o GNU find para recorrer a todos os arquivos; imprimir timestamp com caminho de arquivo e classificar por data:

find /path/mydir -printf "%T+\t%p\n" | sort | tail -1

Apenas para o registro de data e hora da época,

find /path/mydir -printf "%T@\n" | sort | tail -1
    
por 28.12.2017 / 20:38
2

Certifique-se de que o zsh esteja instalado (todas as principais distribuições possuem um pacote para ele).

zsh -c 'ls -log **/*(.om[1])' | awk '{print $4, $5, $6}'

**/* é um padrão de caractere curinga para corresponder todos os arquivos em subdiretórios de forma recursiva e (.om[1]) são qualificadores da glob para limitar as correspondências a arquivos regulares ( . ) , classifique por hora de modificação ( om ) e mantenha apenas o arquivo mais recente ( [1] ). Os qualificadores Glob são um recurso exclusivo do zsh e muitas de suas funcionalidades, em particular a classificação, são difíceis de reproduzir em outros shells.

Eu incluo apenas arquivos regulares, pois isso geralmente é necessário - mas você pode querer remover o . qualificador se quiser que o registro de data e hora reflita a última vez que um arquivo foi excluído, por exemplo.

O GNU ls tem uma opção para controlar o formato de hora ( --time-style ). Observe que, dependendo do formato da hora, talvez seja necessário ajustar o pós-processamento para extrair o campo de hora.

Como alternativa, você pode usar o comando stat do Linux ou o stat builtin para imprimir o registro de data e hora em seu formato desejado.

zsh -c 'zmodload zsh/stat; stat +mtime -- **/*(.om[1])'
    
por 28.12.2017 / 22:35
1

Dadas as e , bem como a especificação" linux bash "na questão, aqui está uma função bash específica que produzirá o nome do arquivo e o registro de data e hora do arquivo modificado mais recentemente em uma determinada estrutura de diretório:

function lastmodified () (
  shopt -s globstar
  latest=
  t=0
  for f in "$1"/**
  do
    x=$(stat -c "%Y" "$f")
    if [ $x -gt $t ]
    then
      latest="$f"
      t="$x"
    fi
  done
  printf "%s\n" "$latest"
  printf "%s\n" "$(date -d @${t})"
)

Use como: lastmodified /path/mydir .

Ele é executado em um subshell para isolar o globstar opção shell , bem como as várias atribuições de variáveis. Altere ou remova as instruções printf para capturar os dados de seu interesse.

Funciona pedindo ao bash para expandir todos os caminhos de nome de arquivo sob o parâmetro $1 , e então verifica o "Tempo da última modificação como segundos desde a Epoch" com o stat . O nome do arquivo mais recente terminará em $latest e seu registro de data e hora em t .

    
por 28.12.2017 / 21:34
1
find . -type f -exec ls -ltr {} \; | awk '{print $6"-"$7"-"$8" "$9}' | sort -k3 | sort -nr | head -1

O formato de saída é Month-date-hour-minute filename

Dec-30-03:10 ./1

Como o arquivo foi criado este ano, o ano não é exibido. O código pode ser modificado para sempre mostrar o ano, se você quiser sempre o ano mostrado.

    
por 29.12.2017 / 23:04