Procurando por um comando que retorne o arquivo mais recente em um diretório.
Não está vendo um parâmetro limite para ls
...
linux
command-line
ack
fonte
fonte
watch -n1 'ls -Art | tail -n 1'
- mostra os últimos arquivosls
ou a utilizaçãofind
sem a-print0
qual é problemática para lidar com nomes de arquivos irritantes. Sempre útil mencionar: BashFAQ099, que fornece uma resposta POSIX para esse problemaRespostas:
Não é muito elegante, mas funciona.
fonte
ls
paratail
e imprime apenas a ÚLTIMA linha. IMHO, é melhor classificar em ordem crescente e usarhead
, comochaos
sugerido. Após a impressão, o cabeçote da primeira linha é encerrado; portanto, o envio da próxima linha (na verdade, o próximo bloco) aumentará um SIGPIPE e tambémls
será encerrado.Na verdade, este comando fornece o arquivo modificado mais recente no diretório de trabalho atual.
fonte
ls -tl | head -n 1
e não precisa empurrar a tabela inteira pelo cano da maneira que a minha faz.ls -t *.png | head -n1
ls -Art | head -n1
se você deseja especificamente o último arquivo modificadoEsta é uma versão recursiva (ou seja, encontra o arquivo atualizado mais recentemente em um determinado diretório ou em qualquer um de seus subdiretórios)
Edit: use em
-f 2-
vez de-f 2
como sugerido por Kevinfonte
find $DIR -type f -exec stat -lt "%Y-%m-%d" {} \+ | cut -d' ' -f6- | sort -n | tail -1
sort -nr
, poderá usar emhead -n 1
vez detail -n 1
e melhorar um pouco a eficiência. (Embora se você está classificando um achado recursiva, ficando a primeira ou última linha não será a parte lenta.)find ./ -type f -printf "%T@ %p\n" -ls | sort -n | cut -d' ' -f 2- | tail -n 1 | xargs -r ls -lah
find $DIR -type f -exec stat -lt "%F %T" {} \+ | cut -d' ' -f6- | sort -n | tail -1
Uma observação sobre confiabilidade:
Como o caractere de nova linha é tão válido quanto qualquer outro no nome de arquivo, qualquer solução que dependa de linhas como o
head
/tail
baseadas em é falha.Com o GNU
ls
, outra opção é usar a--quoting-style=shell-always
opção e umabash
matriz:(adicione a
-A
opção als
se você também quiser considerar arquivos ocultos).Se você deseja limitar a arquivos regulares (desconsiderar diretórios, fifos, dispositivos, links simbólicos, sockets ...), você precisará recorrer ao GNU
find
.Com o bash 4.4 ou mais recente (para
readarray -d
) e o GNU coreutils 8.25 ou mais recente (paracut -z
):Ou recursivamente:
O melhor aqui seria usar
zsh
e seus qualificadores glob em vez debash
evitar todo esse aborrecimento:O arquivo regular mais recente no diretório atual:
Incluindo os ocultos:
Segundo mais novo:
Verifique a idade do arquivo após a resolução do link simbólico:
Recursivamente:
Além disso, com o sistema de conclusão (
compinit
e co) ativado, Ctrl+Xmtorna-se um complemento que se expande para o arquivo mais recente.Assim:
Isso faria você editar o arquivo mais recente (você também terá a chance de ver qual arquivo antes de pressionar Return).
Para o segundo arquivo mais recente.
para o
c
arquivo mais recente .para o arquivo regular mais recente (não diretório, nem fifo / dispositivo ...) e assim por diante.
fonte
zsh
dicas. Você poderia fornecer um link para mais detalhes sobre isso no zsh docs?info zsh qualifiers
Eu uso:
ls -ABrt1 --group-directories-first | tail -n1
Dá-me apenas o nome do arquivo, excluindo pastas.
fonte
ls -lAtr | tail -1
As outras soluções não incluem arquivos que começam com
'.'
.Este comando também incluirá
'.'
e'..'
, que pode ou não ser o que você deseja:ls -latr | tail -1
fonte
Variante em curto com base na resposta de dmckee:
fonte
-1
sintaxe do cabeçalho foi descontinuada há algum tempo e-n 1
deve ser usada.Eu gosto
echo *(om[1])
(zsh
sintaxe), pois isso apenas fornece o nome do arquivo e não chama nenhum outro comando.fonte
A solução de localização / classificação funciona muito bem até o número de arquivos ficar realmente grande (como um sistema de arquivos inteiro). Use o awk para acompanhar o arquivo mais recente:
fonte
Pessoalmente, prefiro usar o menor número possível de
bash
comandos internos (para reduzir o número de syscalls de fork e exec caros). Para classificar por data, ols
necessário para ser chamado. Mas o uso dehead
não é realmente necessário. Eu uso o seguinte one-liner (funciona apenas em sistemas que suportam pipes de nomes):ou para obter o nome do arquivo mais antigo
(Observe o espaço entre as duas marcas '<'!)
Se os arquivos ocultos também forem necessários, um arg poderá ser adicionado.
Espero que isso possa ajudar.
fonte
usando a opção recursiva R .. você pode considerar isso como aprimoramento para obter boas respostas aqui
fonte
Irá mostrar o último item modificado na pasta. Parear com
grep
para encontrar as entradas mais recentes com palavras-chavefonte
1
é para a primeira linha equivalente aohead -n 1
que é q?Recursivamente:
fonte
tente este comando simples
Se você quiser nome do arquivo - modificado pela última vez, caminho = /ab/cd/*.log
Se desejar o nome do diretório - modificado pela última vez, caminho = / ab / cd / * /
fonte
Presumindo que você não se importe com arquivos ocultos que começam com um
.
De outra forma
fonte
Somente com os Bash embutidos, seguindo de perto o BashFAQ / 003 :
fonte
Todas essas soluções ls / tail funcionam perfeitamente bem para arquivos em um diretório - ignorando subdiretórios.
Para incluir todos os arquivos em sua pesquisa (recursivamente), a localização pode ser usada. gioele sugeriu classificar a saída de localização formatada. Mas tenha cuidado com os espaços em branco (a sugestão dele não funciona com espaços em branco).
Isso deve funcionar com todos os nomes de arquivos:
Isso classifica por mtime, veja o homem encontrar:
Então, basta substituir
%T
por%C
para classificar por ctime.fonte
find $DIR -type f -printf "%T@ %p\n" | sort -n | cut -d' ' -f 2- | tail -n 1
Ou, como alternativa, mantenha tudo, exceto o primeiro campo:find $DIR -type f -printf "%T@ %p\n" | sort -n | cut -d' ' -f 1 --complement | tail -n 1
Localizando o arquivo mais atual em todos os diretórios de acordo com um padrão, por exemplo, os subdiretórios do diretório de trabalho com nome terminado em "tmp" (sem distinção entre maiúsculas e minúsculas):
fonte
fonte
Se você deseja obter o arquivo alterado mais recente e também incluir subdiretórios, pode fazê-lo com este pequeno oneliner:
Se você deseja fazer o mesmo, não para arquivos alterados, mas para arquivos acessados, basta alterar o
% Y parâmetro a partir da estatística de comando para % X . E seu comando para os arquivos acessados mais recentes se parece com o seguinte:
Para ambos os comandos, você também pode alterar o parâmetro var = "1" se desejar listar mais de um arquivo.
fonte
Eu também precisava fazer isso e encontrei esses comandos. estes funcionam para mim:
Se você deseja o último arquivo por sua data de criação na pasta (horário de acesso):
E se você quiser o último arquivo com alterações em seu conteúdo (hora da modificação):
fonte