Con frecuencia descargo archivos PDF con nombres de archivos numéricos atroces desde mi navegador. Estos entran automáticamente en ~/Downloads
. Idealmente me gustaría poder abrir estos archivos con:
evince "the most recently modified file"
sin tener que abrir ~/Downloads
para buscar el nombre del archivo.
¿Existe una forma sencilla de especificar "el archivo modificado más recientemente" en bash
?
NOTA: Sé que esposiblepara hacer esto, pero lo ideal es que esté buscando una solución que sea más sencilla que ls -t
verificar ~/Downloads
el nombre.
Respuesta1
evince "$(ls -t | head -n1)"
Si bien manejará espacios, tabulaciones y (creo) impresión especial, se interrumpirá si el nombre del archivo contiene una nueva línea y posiblemente algunos otros caracteres que no se imprimen.
Respuesta2
Este es un enfoque más correcto y sólido que el de ls -t
, a costa de cierta complejidad adicional.
Configuración
Agregue un breve script de shell (código a continuación) a su archivo $PATH
. ~/bin
es un buen lugar para ello.
Recuerde asegurarse
- el script es ejecutable
chmod +x ~/bin/script_name
~/bin
está en tu$PATH
Uso
Pase el comando que desea ejecutar en el archivo más nuevo ~/Download
a last_download
.
Ejemplos
Suponiendo que hayas nombrado el guiónlast_download
last_download
(sin argumentos): ejecutaevince
, el comando predeterminado, en el archivo más nuevo de~/Downloads
last_download mplayer
: se ejecutamplayer
en el archivo más nuevo en~/Downloads
last_download cp -t ~/Desktop
: copia el archivo más nuevo~/Downloads
en~/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: El script sólo busca dentro, ~/Download
pero no sería difícil generalizarlo para que admita cualquier directorio, en cuyo caso también se justificaría un cambio de nombre.
Respuesta3
exec zsh
evince ~/Downloads/*.pdf(om[1])
o si no quieres cambiar a zsh
cd ~/Downloads
zsh -c 'evince ./*.pdf(om[1])'
Los bits entre paréntesis sonclasificatorios globales. om
cambia el orden de los globos para usar la hora de modificación en lugar del nombre (el más nuevo primero). [1]
significa utilizar sólo la primera coincidencia.
Para más información, veresta respuesta a "¿Cómo filtro un globo en zsh?".
Respuesta4
No, e incluso si lo hubiera, no podría estar seguro de que algún registro del sistema no sea generalmente el archivo actualizado más recientemente.
La respuesta de Kevin (se me adelantó) funciona si solo quieres evitara manoapertura ~/Downloads
.