Frequentemente faço download de arquivos PDF com nomes de arquivo numéricos hediondos do meu navegador. Eles entram automaticamente em ~/Downloads
. Idealmente, eu gostaria de poder abrir esses arquivos com:
evince "the most recently modified file"
sem ter que abrir ~/Downloads
para encontrar o nome do arquivo.
Existe uma maneira simples de especificar "o arquivo modificado mais recentemente" em bash
?
NOTA: eu sei que épossívelpara fazer isso, mas o ideal é que estou procurando uma solução que seja mais simples do que ls -t
verificar ~/Downloads
o nome.
Responder1
evince "$(ls -t | head -n1)"
Embora ele lide com espaços, tabulações e (acredito) impressão especial, ele será interrompido se o nome do arquivo contiver uma nova linha e, possivelmente, em alguns outros caracteres não imprimíveis.
Responder2
Esta é uma abordagem mais correta e robusta do que ls -t
, ao custo de alguma complexidade adicional.
Configurar
Adicione um script de shell curto (código abaixo) ao seu arquivo $PATH
. ~/bin
é um bom lugar para isso.
Lembre-se de ter certeza
- o script é executável
chmod +x ~/bin/script_name
~/bin
está em seu$PATH
Uso
Passe o comando que deseja executar no arquivo mais recente ~/Download
para last_download
.
Exemplos
Supondo que você nomeou o scriptlast_download
last_download
(sem argumentos): executaevince
, o comando padrão, no arquivo mais recente em~/Downloads
last_download mplayer
: é executadomplayer
no arquivo mais recente em~/Downloads
last_download cp -t ~/Desktop
: copia o arquivo mais recente~/Downloads
para~/Desktop
Código
#!/bin/sh
# Usage: last_download [cmd [options]...]
newest=
dir=~/Downloads
# default command
if [ $# -eq 0 ]; then
set -- evince;
fi
# find newest file
for f in "$dir"/*; do
if [ -z "$newest" ] || [ "$f" -nt "$newest" ]; then
newest="$f"
fi
done
if ! [ -e "$newest" ]; then
exit 1
fi
# run command on newest file
"$@" "$newest"
Nota: O script apenas procura, ~/Download
mas não seria difícil generalizá-lo para suportar qualquer diretório; nesse caso, uma mudança de nome também seria garantida.
Responder3
exec zsh
evince ~/Downloads/*.pdf(om[1])
ou se você não quiser mudar para zsh
cd ~/Downloads
zsh -c 'evince ./*.pdf(om[1])'
Os bits entre parênteses sãoeliminatórias globais. om
altera a ordem dos globs para usar o horário de modificação em vez do nome (o mais recente primeiro). [1]
significa usar apenas a primeira partida.
Para mais informações, vejaesta resposta para "Como faço para filtrar um glob em zsh".
Responder4
Não, e mesmo que houvesse, você não poderia ter certeza de que algum log do sistema normalmente não seria o arquivo atualizado mais recentemente.
A resposta de Kevin (ele chegou antes de mim) funciona se você quiser apenas evitarmanualmenteabertura ~/Downloads
.