Sistema operacional: Linux
Tipo de sistema de arquivos: ext3
Solução preferida: bash (script / oneliner), ruby, python
Eu tenho vários diretórios com vários subdiretórios e arquivos. Eu preciso fazer uma lista de todos esses diretórios que são construídos de forma que todos os diretórios de primeiro nível sejam listados ao lado da data e hora do último arquivo criado / modificado dentro dele.
Para esclarecer, se eu tocar em um arquivo ou modificar seu conteúdo alguns níveis de subdiretório, esse registro de data e hora deve ser exibido ao lado do nome do diretório de primeiro nível. Digamos que eu tenha um diretório estruturado assim:
./alfa/beta/gamma/example.txt
e eu modifico o conteúdo do arquivo example.txt
, preciso que o horário seja exibido ao lado do diretório de primeiro nível alfa
em formato legível por humanos, não em época. Eu tentei algumas coisas usando find, xargs
, sort
e os gostos, mas não posso contornar o problema que o timestamp sistema de arquivos de 'alfa' não muda quando eu criar / modificar arquivos de alguns níveis para baixo.
fonte
Respostas:
Tente este:
Execute-o com o caminho para o diretório em que deve começar a varredura recursivamente (ele suporta nomes de arquivos com espaços).
Se houver muitos arquivos, pode demorar um pouco antes de retornar qualquer coisa. O desempenho pode ser aprimorado se usarmos
xargs
:o que é um pouco mais rápido.
fonte
find $1 -type f -print0 | xargs -0 stat --format '%Y :%y %n' | sort -nr | cut -d: -f2- | head
Isso ainda consegue ser rápido para mim.brew install coreutils
e usar emgstat
vez destat
stat
poisfind PATH -type f -printf "%T@ %p\n"| sort -nr
faz o trabalho. Também é um pouco mais rápido assim.find PATH -type f -exec stat -f "%m %N" "{}" \; | sort -nr | head
Para encontrar todos os arquivos cujo status foi alterado pela última vez há N minutos:
find -cmin -N
por exemplo:
find -cmin -5
fonte
sudo find -cmin -1 2>&1 |grep -v /proc/
O GNU Find (consulte
man find
) possui um-printf
parâmetro para exibir os arquivos EPOC mtime e o nome do caminho relativo.fonte
tail
para impedir que milhares de linhas sejam impressas na saída.awk '{print $2}'
parte parece causar problemas quando há nomes de arquivos com espaços. Aqui está uma solução usandosed
em vez disso, e também imprime o tempo, além do caminho:find . -type f -printf '%T@ %Tc %P\n' | sort -n | tail | sed -r 's/^.{22}//'
touch "lala<Enter>b"
para criar esse arquivo. Eu acho que o design de utilitários unix tem uma grande falha no nome do arquivo.Eu encurtei a resposta incrível da auréola para essa frase
Atualizado : se houver espaços nos nomes de arquivos, você poderá usar esta modificação
fonte
IFS=$'\n'
não é seguro em nenhum caso ao manipular nomes de arquivos: as novas linhas são caracteres válidos nos nomes de arquivos no UNIX. Apenas o caractere NUL é garantido para não estar presente em um caminho.Tente isto
Ele usa
find
para reunir todos os arquivos do diretório,ls
listá-los classificados por data de modificação,head
selecionar o 1º arquivo e finalmentestat
mostrar a hora em um bom formato.No momento, não é seguro para arquivos com espaço em branco ou outros caracteres especiais em seus nomes. Escreva um elogio se ele ainda não atender às suas necessidades.
fonte
Este comando funciona no Mac OS X:
find "$1" -type f -print0 | xargs -0 stat --format '%Y :%y %n' | sort -nr | cut -d: -f2- | head
No Linux, como o pôster original pediu, use em
stat
vez degstat
.Essa resposta é, obviamente, a excelente solução do user37078 , promovida do comentário à resposta completa. Eu misturei o insight de CharlesB para usar
gstat
no Mac OS X. Eu peguei coreutils do MacPorts em vez de homebrew , a propósito.E aqui está como eu empacotei isso em um comando simples
~/bin/ls-recent.sh
para reutilização:fonte
~/bin/ls-recent.sh
, verificou cuidadosamente o script quanto a diferenças?find . -exec stat -f '%m%t%Sm %N' {} + | sort -n | cut -f2-
As soluções perl e Python desta postagem me ajudaram a resolver esse problema no Mac OS X: /unix/9247/how-to-list-files-sorted-by-modification-date-recursively -no-stat-command-avail .
Citando a partir da postagem:
Perl:
Pitão:
fonte
Ignorando arquivos ocultos - com carimbo de tempo agradável e rápido
Lida bem com espaços nos nomes de arquivos - não que você deva usá-los!
É
find
possível encontrar mais abundância seguindo o link.fonte
Estou mostrando isso para o tempo de acesso mais recente. Você pode modificá-lo facilmente para fazer o tempo de modificação mais recente.
Há duas maneiras de fazer isso:
1) Se você deseja evitar a classificação global, que pode ser cara se tiver dezenas de milhões de arquivos, você pode: (posicionar-se na raiz do diretório em que deseja iniciar sua pesquisa)
O método acima imprime nomes de arquivos com tempo de acesso progressivamente mais recente e o último arquivo impresso é o arquivo com o tempo de acesso mais recente. Obviamente, você pode obter o tempo de acesso mais recente usando um "tail -1".
2) Você pode encontrar recursivamente imprimir o nome, acessar o tempo de todos os arquivos em seu subdiretório e classificar com base no tempo de acesso e seguir a maior entrada:
E aí está ...
fonte
Eu tenho esse alias no meu perfil que uso com bastante frequência
Então, ele faz o que você está procurando (com exceção de que não percorre vários níveis de alteração de data / hora) - procura os arquivos mais recentes (arquivos * .log e * .trc nesse caso); também encontra apenas arquivos modificados no último dia, depois classifica por tempo e canaliza a saída com menos:
ps. Observe que eu não tenho root em alguns servidores, mas sempre tenho sudo, então você pode não precisar dessa parte.
fonte
Você pode dar o comando printf de encontrar uma tentativa
fonte
Função bash rápida:
Encontre o arquivo modificado mais recente em um diretório:
Você também pode especificar seu próprio formato de data / hora como o terceiro argumento.
fonte
A seguir, você retorna uma sequência do carimbo de data e hora e o nome do arquivo com o carimbo de data e hora mais recente:
Resultando em uma saída do formulário:
<yy-mm-dd-hh-mm-ss.nanosec> <filename>
fonte
Aqui está uma versão que funciona com nomes de arquivos que podem conter espaços, novas linhas, caracteres glob também:
find ... -printf
imprime modificação de arquivo (valor EPOCH) seguido por um espaço e\0
nomes de arquivos finalizados.sort -zk1nr
lê dados terminados em NUL e os classifica inversamente numericamenteComo a pergunta está marcada com o Linux, estou assumindo que os
gnu
utils estão disponíveis.Você pode canalizar acima com:
para imprimir a hora da modificação e os nomes dos arquivos classificados pela hora da modificação (mais recente primeiro) finalizada por novas linhas.
fonte
Isto é o que eu estou usando (muito eficiente):
PROS:
USO:
Onde:
dir
- um diretório a ser pesquisado [dir atual]number
- número de arquivos mais recentes a serem exibidos [10]Saída para se
find_last /etc 4
parece com isso:fonte
Para
ls
saída simples , use isso. Não há lista de argumentos, portanto, não pode demorar muito:E agradecido
cut
apenas pelas datas, horas e nome:EDIT : observei que a resposta principal atual é classificada por data de modificação. Isso é tão fácil com o segundo exemplo aqui, já que a data da modificação é a primeira em cada linha - coloque uma classificação no final:
fonte
Isso também pode ser feito com uma função reccursiva no bash
Seja F uma função que exibe a hora do arquivo que deve ser ordenada lexicograficamente aaaa-mm-dd etc., (dependente do SO?)
R a função recursiva executada pelos diretórios
E finalmente
fonte