Como posso fazer um simples find
que ordenaria os resultados pela última modificação?
Aqui está o atual find
que estou usando (estou fazendo um escape de shell no PHP, então esse é o raciocínio para as variáveis):
find '$dir' -name '$str'\* -print | head -10
Como eu poderia ter essa ordem modificada pela pesquisa mais recentemente? (Observe que não quero que ele classifique 'depois' da pesquisa, mas encontre os resultados com base no que foi modificado mais recentemente).
Respostas:
Usa isto:
printf
argumentos deman find
:%Tk
: Hora da última modificação do arquivo no formato especificado pork
.@
: segundos desde 1 de janeiro de 1970, 00:00 GMT, com parte fracionária.c
: data e hora da localidade (Sáb 04 de novembro 12:02:33 EST 1989).%p
: Nome do arquivo.fonte
~/.zshrc
:fr () { find ./ -iname "*"$@"*" -printf "%T@ %Td-%Tb-%TY %Tk:%TM %p\n" | sort -n | cut -d " " -f 2- | grep -i "$@" ; }
Ele encontra recursivamente todos os arquivos que contêm o padrão do primeiro argumento passado ao comando (fr <pattern>
) e os classifica com o último mais recente.find -L ...
ssed
para se livrar da parte fracionária de segundos e ainda usar a ISO8601, como @ PeterMortensen mostrou:find . -type f -printf "%TY-%Tm-%TdT%TT %p\n" | sort -r | ssed -R 's/^([^.]+)\.\d+ (.*)$/\1 \2/'
O método mais fácil é usar o zsh, graças aos seus qualificadores globais .
Se você encontrar o GNU, faça-o imprimir os tempos de modificação do arquivo e classifique-os de acordo com isso.
Se você tiver o GNU find, mas não outros utilitários do GNU, use novas linhas como separadores em vez de nulos; você perderá o suporte para nomes de arquivos contendo novas linhas.
Se você possui Perl (aqui assumirei que não há novas linhas nos nomes dos arquivos):
Se você possui Python (também assumindo que não há novas linhas nos nomes dos arquivos):
Provavelmente existe uma maneira de fazer o mesmo no PHP, mas eu não sei.
Se você deseja trabalhar apenas com ferramentas POSIX, é um pouco mais complicado; veja Como listar arquivos ordenados por data de modificação de forma recursiva (nenhum comando de estatísticas disponíveis!) (retatining o primeiro 10 é a parte mais fácil).
fonte
find
versão mostra os arquivos mais antigos, e que você precisa adicionar a-r
opçãosort
.Você não precisa de PHP ou Python, apenas sl :
Se o comando * sair com um status de falha (por exemplo, a lista de argumentos é muito longa ), você poderá iterar com a localização. Parafraseado de: O tamanho máximo de argumentos para um novo processo
find . -print0|xargs -0 command
(otimiza a velocidade, se a localização não implementar "-exec +", mas souber "-print0")find . -print|xargs command
(se não houver espaço em branco nos argumentos)Se a maior parte dos argumentos consistir em caminhos longos, absolutos ou relativos, tente mover suas ações para o diretório:
cd /directory/with/long/path; command *
E outra solução rápida pode ser a de corresponder a menos argumentos:command [a-e]*; command [f-m]*; ...
fonte
Você só precisa de ls
Você pode fazer o
find /wherever/your/files/hide -type f -exec ls -1rt "{}" +;
que foi dito acima,ou
fonte
xargs
ligarls
várias vezes, a classificação será interrompida.+;
o final faz? Parece dar o mesmo resultado sem o;
porém não funciona sem o+
?Estendendo a resposta de user195696 :
Para cada arquivo, isso gera primeiro o carimbo de data / hora numérico (para classificação, seguido por tabulação
\t
), depois um carimbo de data / hora legível por humanos, depois o tamanho do arquivo (infelizmentefind
não é-printf
possível fazer em mebibytes, apenas kibibytes) e o nome do arquivo com caminho.Em seguida,
sort -n
classifica-o pelo primeiro campo numérico.Em seguida,
cut
elimina o primeiro campo numérico que não interessa ao usuário. (Imprime o segundo campo em diante.) O separador de campo padrão é\t
ou tabulação.Exemplo de saída:
Eu deliberadamente criei o campo de tamanho de arquivo com 6 caracteres, porque, se o prolongar, fica difícil distinguir visualmente o tamanho dos arquivos. Dessa forma, arquivos maiores que 1e6 KiB se destacam: por 1 caractere significa 1-9 GB, por 2 caracteres significa 10-99 GB, etc.
Edit: aqui está outra versão (desde
find . -printf "%Tc"
falhas no MinGW / MSYS):Dando saída como:
Onde:
-I{}
faz com que a ocorrência{}
seja substituída por um argumento, e as novas linhas agora são os separadores de argumentos (observe os espaços nos nomes de arquivos acima).ls -G
suprime a impressão do nome do grupo (desperdício de espaço).ls -h --si
produz tamanhos de arquivo legíveis por humanos (mais correto com--si
).ls -t
classifica por tempo, o que é irrelevante aqui, mas é o que eu normalmente uso.fonte
T@
bys
em um dos comandos acima.Variante do OS X da resposta de @ user195696:
Com registro de data e hora:
Sem registro de data e hora:
fonte
Descobri que isso faz o trabalho no Mac OS X (e genérico o suficiente para funcionar em outro Unixen também):
fonte
Se sua
find
seleção for muito simples, você poderá ficar sem ela e usels
:fonte
Experimentar:
Mas também é útil filtrar dados por
-mmin
/-mtime
e-type
.fonte
Usar:
Este comando classificará os arquivos por data de modificação.
E exibir como:
fonte
Eu tenho uma solução simples que funciona para FreeBSD (OS X) e Linux:
fonte
Eu acho que não
find
tem nenhuma opção para modificar a ordem de saída.-mtime
e-mmin
permitirá restringir os resultados a arquivos que foram modificados dentro de uma determinada janela de tempo, mas a saída não será classificada - você terá que fazer isso sozinho. O GNUfind
tem uma-printf
opção que, entre outras coisas, permite imprimir o tempo de modificação de cada arquivo encontrado (formatar cadeias%t
ou%Tk
); Isso pode ajudá-lo a classificar afind
saída da maneira que desejar.fonte
Melhorei a resposta do Akashs, fazendo o script manipular espaços em branco nos nomes de arquivos corretamente:
fonte
Se você deseja solicitar todos os arquivos PNG por hora em
$PWD
:Este one-liner simples dá toda a flexibilidade de regexp em
find
e sobrels
.fonte
Você pode usar
stat
no BSD e Linux (não no POSIX) desta maneira:Se você deseja limitar o número:
fonte
Há uma maneira limpa e robusta de
sort | head
data:Usando
ls -l
para impressão bonitaComo uma função bash :
Isso pode ser executado com um ou dois argumentos, ou mesmo sem:
Amostra:
Listará todos os diretórios não classificados por data. Nota:
Mesmo na grande árvore do sistema de arquivos, como a
xargs
lista de recebimento já classificada, a ordem dos arquivos permanece correta, mesmo quels
deva ser executada várias vezes.Listará mais 12 diretórios não recentes classificados por data, com o tamanho impresso em formato legível por humanos
Listará mais 42 links simbólicos recentes
Irá listar todos os links simbólicos, dispositivos de bloco, soquetes e caracteres, classificados por data.
Ordem de inversão
Substituir
head
portail
e mudar interruptor desort
els
:Mesma função, mesmo uso:
fonte
Se você quiser apenas obter um caminho completo de cada item, anote assim.
Onde
-printf "% T @% p \ n" para fornecer critérios de classificação (data),
'sort -nr' para classificar por data,
head -10 para listar os 10 melhores resultados,
corte -d '' -f 2 para cortar o timestamp inicial em cada linha.
fonte
cut -d ' ' -f 2
será interrompido se os nomes de arquivos contiverem espaços.Eu tenho uma solução simples.
Depois
cd
de um diretório, usefind . -iname "*" -ls
fonte