Configurar

Configurar

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 ~/Downloadspara 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 -tverificar ~/Downloadso 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ávelchmod +x ~/bin/script_name
  • ~/binestá em seu$PATH

Uso

Passe o comando que deseja executar no arquivo mais recente ~/Downloadpara last_download.

Exemplos

Supondo que você nomeou o scriptlast_download

  • last_download(sem argumentos): executa evince, o comando padrão, no arquivo mais recente em~/Downloads
  • last_download mplayer: é executado mplayerno arquivo mais recente em~/Downloads
  • last_download cp -t ~/Desktop: copia o arquivo mais recente ~/Downloadspara~/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, ~/Downloadmas 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. omaltera 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.

informação relacionada