Autocomplete o arquivo mais recente

13

Eu tenho um processo que cria arquivos de texto cujos nomes de arquivo são baseados no timestamp de seu momento de criação:

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

Como posso preencher automaticamente o nome do arquivo mais recente criado , ou seja, o arquivo com o último mtime? Não há como usar o preenchimento de tabulação para esses arquivos, pois quase todos os caracteres no nome do arquivo são compartilhados com outro arquivo. Eu estou esperando para encontrar um atalho (como Alt . que autocomplete o último argumento do último comando). Eu consegui inventar o seguinte alias que é ótimo para VIM , mas eu adoraria saber se existe um atalho de propósito geral que eu poderia usar com kde-open , sqlite3 e outros aplicativos.

alias lastest="vim 'ls -t | grep -vE "^total [0-9]*$" | head -n1'"
    
por dotancohen 12.09.2013 / 10:20

4 respostas

6

Basta remover o vim do alias. Faça algo assim:

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

Você pode usar qualquer programa para abrir os arquivos mais recentes:

emacs 'latest'
ls 'latest'
mv 'latest' ../

etc.

No entanto, isso irá quebrar se seus nomes de arquivos tiverem espaços ou caracteres estranhos, e é por isso que você nunca deve analisar ls . Uma maneira melhor seria algo assim (adicione isso ao seu .bashrc ):

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

Esta função executará qualquer comando que você fornecer como argumento e transmitirá o resultado da chamada find (o arquivo mais recente) para esse comando. Então, você pode fazer coisas como:

latest emacs
latest less

Se você precisar fazer coisas como mv $(latest) foo/ , tente fazer isso em vez disso:

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
}

Então, para copiar o arquivo mais recente para bar/ , você faria

latest cp bar

E você ainda pode fazer latest emacs da mesma forma que antes.

    
por 12.09.2013 / 17:17
5

Você pode definir facilmente isso em zsh , por exemplo com algo parecido com isto:

zstyle ':completion:*' file-sort date

(você também pode alterar a linha de modo que esse estilo seja usado apenas para determinados padrões de nome de arquivo)

zsh é muito parecido com o bash, você poderia chamá-lo de um superconjunto de bash - feature- / usage para a direita.

Mas talvez o bash tenha um recurso semelhante.

    
por 12.09.2013 / 17:15
3

Como o arquivo mais recente também é classificado por último, você pode usar menu-complete-backward . menu-complete e menu-complete-backward alternam entre as conclusões ou inserem a primeira ou a última conclusão. Eu os vinculei à guia de opção e à guia shift em ~/.inputrc :

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

Seu emulador de terminal pode não inserir \e[Z quando você pressiona a tecla shift. Use C-v ou cat -v para ver qual texto é inserido quando você pressiona uma combinação de teclas.

    
por 15.09.2013 / 17:47
2

O pano de fundo da pergunta é a velocidade de uso. Eu acho uma macro de teclado mais apropriada. Adicionar a ~/.inputrc :

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

Outras ideias: Originalmente, queria algo que me desse o primeiro, o segundo e o terceiro arquivo mais recente. Uma ideia seria, marcar os lugares com um token, por ex. "grep x _", em seguida, executar uma macro de teclado "\ C-alatest-expansion \ Cm" e "latest-expansion" solicita uma lista de seleção de curses para selecionar os arquivos mais recentes para cada token "_" na linha de comando.

Eu considero isso uma questão importante, porque uma vantagem remanescente da GUI sobre SHELL é para mim a seleção de arquivos e diretórios usados / criados recentemente. autojump ajuda um pouco nos diretórios, falta uma solução para os arquivos.

    
por 28.10.2016 / 08:55