Autocompletar el archivo más nuevo

13

Tengo un proceso que crea archivos de texto cuyos nombres de archivo se basan en la marca de tiempo de su momento de creación:

$ ls
1378971222.txt
1378971254.txt
1378971482.txt
1378971488.txt
1378972089.txt
1378972140.txt
1378972141.txt
1378972153.txt
1378972155.txt
1378972241.txt

¿Cómo podría completar automáticamente el nombre del archivo del último archivo creado , es decir, el archivo con el último mtime? No hay forma de usar la finalización de tabulación para estos archivos, ya que casi todos los caracteres del nombre de archivo se comparten con otro archivo. Espero encontrar un acceso directo (como el Alt .que completa automáticamente el último argumento del último comando). He conseguido inventar los siguientes alias que es ideal para VIM, pero me gustaría saber si un acceso directo de propósito general existe que podría utilizar con kde-open, sqlite3y otras aplicaciones.

alias lastest="vim `ls -t | grep -vE "^total [0-9]*$" | head -n1`"
dotancohen
fuente
Después de leer todo eso, la pregunta parece no tener una respuesta satisfactoria aún sobre cómo tener un atajo de teclado para insertar la última ruta de archivo (a la finalización de bash y, con suerte, también recorrer en orden cronológico) en el shell de bash.
Roman Susi
@RomanSusi: Esta respuesta más cercana es de Weidenrinde, pero solo inserta un literal $(ls -t|head -1)en la línea. Por lo tanto, no ciclismo. En ausencia de una respuesta satisfactoria, acepté la respuesta que más me enseñó y me brinda la mayor utilidad.
dotancohen
Seguro. Se me ocurrió que podría ser una característica genial de shell, y me preguntaba por qué nadie lo había implementado todavía.
Roman Susi

Respuestas:

6

Simplemente elimine el vimdel alias. Haz algo como esto:

alias latest='ls -tr | tail -n 1'

Luego puede usar cualquier programa para abrir los archivos más recientes:

emacs `latest`
ls `latest`
mv `latest` ../

etc.

Sin embargo, esto se romperá si los nombres de sus archivos tienen espacios o caracteres extraños, por lo que nunca debe analizarlosls . Una mejor manera sería algo como esto (agregue esto a su .bashrc):

function latest(){
  $1 "$(find . -type f -printf "%C@ %p\n" | sort | tail -n 1 | cut -d " " -f 2-)"
}

Esta función ejecutará cualquier comando que le des como argumento y pasará el resultado de la findllamada (el último archivo) a ese comando. Entonces, puedes hacer cosas como:

latest emacs
latest less

Si necesita poder hacer cosas como mv $(latest) foo/probar este en su lugar:

function latest(){
   A=(${@})
   prog=$1;
   lat=$(find . -type f -printf "%C@ %p\n" | sort | tail -n 1 | cut -d " " -f 2-)
   if [ ! -z $2 ] ; then 
     args=${A[@]:1}; 
     $prog "$lat" "${A[@]:1}"
   else
     $prog "$lat"
   fi
}

Luego, para copiar el último archivo a bar/, harías

latest cp bar

Y aún puede hacerlo latest emacsde la misma manera que antes.

terdon
fuente
Gracias, hay bastantes cosas que puedo aprender aquí.
dotancohen
Recomiendo alias latest='\ls -tr | tail -n 1', esto funcionará si tiene un lsalias.
domen
5

Puede configurar esto fácilmentezsh , por ejemplo, con algo como esto:

zstyle ':completion:*' file-sort date

(también puede cambiar la línea de modo que este estilo solo se use para ciertos patrones de nombre de archivo)

zsh es muy similar a bash, probablemente podría llamarlo un superconjunto de bash - feature- / use-wise.

Pero quizás bash tiene una característica similar.

maxschlepzig
fuente
Gracias, esto es genial. Por algunas razones prefiero no mudarme, zshpero si alguna vez lo hago, tengo este marcador.
dotancohen
¡Gracias por presentarme zsh!
dotancohen
3

Dado que el archivo más nuevo también se ordenó al final, puede usarlo menu-complete-backward. menu-completey menu-complete-backwardrecorrer las terminaciones o insertar la primera o la última terminación. Los he vinculado a la pestaña de opciones y a la pestaña Mayús en ~/.inputrc:

"\e\t": menu-complete
"\e[Z": menu-complete-backward

Es posible que su emulador de terminal no se inserte \e[Zcuando presiona shift-tab. Use C-vo cat -vpara ver qué texto se inserta cuando presiona una combinación de teclas.

Lri
fuente
De hecho, los archivos están ordenados alfabéticamente, no cronológicamente. Si descubro cómo ordenar cronológicamente, actualizaré con la información.
dotancohen
2

El trasfondo de la pregunta es la velocidad de uso. Encuentro una macro de teclado más apropiada. Añadir a ~/.inputrc:

# Alt-L --> newest file in directory
"\el": "$(ls -t|head -1)"

Ideas adicionales: Originalmente, quería algo que me diera el primer, segundo, tercer archivo más nuevo. Una idea sería, marcar los lugares con un token, por ejemplo, "grep x _", luego ejecutar una macro de teclado "\ C-alatest-expansion \ Cm" y "última expansión" solicita una lista de selección de maldiciones para elegir los últimos archivos para cada token "_" en la línea de comando.

Considero que esta es una pregunta importante, porque una ventaja restante de GUI sobre SHELL es para mí la selección de archivos y directorios recientemente utilizados / creados. autojumpayuda un poco para los directorios, falta una solución para los archivos.

Weidenrinde
fuente
Gracias, eso es útil. Tenga en cuenta que inserta un literal $(ls -t|head -1)en la línea bash, por lo que debe interpretarse. Eso lo hace menos útil, pero sigue siendo un buen truco.
dotancohen