Preencher automaticamente o arquivo mais recente

13

Eu tenho um processo que cria arquivos de texto cujos nomes de arquivo são baseados no carimbo de data e hora do momento da 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 do último arquivo criado , ou seja, o arquivo com o mtime mais recente? Não há como usar o preenchimento de guias para esses arquivos, pois quase todos os caracteres no nome do arquivo são compartilhados com outro arquivo. Espero encontrar um atalho (como o Alt .que preenche automaticamente o último argumento do último comando). Eu consegui inventar o seguinte apelido que é ótimo para VIM, mas eu gostaria de saber se um atalho de uso geral existe que eu poderia usar com kde-open, sqlite3e outras aplicações.

alias lastest="vim `ls -t | grep -vE "^total [0-9]*$" | head -n1`"
dotancohen
fonte
Depois de ler tudo isso, a pergunta parece não ter uma resposta satisfatória ainda sobre como ter um atalho de teclado para inserir o caminho de arquivo mais recente (à conclusão do bash e, esperançosamente, também percorrer em ordem cronológica) no shell do bash?
Roman Susi
@RomanSusi: Essa resposta mais próxima é de Weidenrinde, mas apenas insere um literal $(ls -t|head -1)na linha. Portanto, não andar de bicicleta. Na ausência de uma resposta satisfatória, aceitei a resposta que mais me ensinou e que fornece mais utilidade.
dotancohen
Certo. Ocorreu-me que poderia ser um recurso interessante do shell e se perguntou por que ninguém ainda o implementou.
Roman Susi

Respostas:

6

Basta remover o vimdo alias. Faça algo parecido com isto:

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 será interrompido se os nomes dos arquivos tiverem espaços ou caracteres estranhos, motivo pelo qual você nunca deve analisarls . 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-)"
}

Essa função executará qualquer comando que você der como argumento e passará o resultado da findchamada (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/esta, tente:

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
}

Em seguida, para copiar o arquivo mais recente bar/, você faria

latest cp bar

E você ainda pode fazer latest emacsda mesma maneira que antes.

terdon
fonte
Obrigado, há algumas coisas que posso aprender aqui.
dotancohen 13/09/13
Eu recomendo alias latest='\ls -tr | tail -n 1'- isso funcionará se você tiver um lsalias.
domen
5

Você pode configurar isso facilmentezsh , por exemplo, com algo como isto:

zstyle ':completion:*' file-sort date

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

zsh é muito semelhante ao bash, você provavelmente poderia chamá-lo de um superconjunto do bash - em termos de recurso / uso.

Mas talvez o bash tenha uma característica semelhante.

maxschlepzig
fonte
Obrigado, isso é ótimo. Por algumas razões, prefiro não me mudar, zshmas, se for o caso, tenho isso marcado!
dotancohen 13/09/13
Obrigado por me apresentar zsh!
dotancohen
3

Como o arquivo mais recente também é classificado por último, você pode usá-lo menu-complete-backward. menu-completee menu-complete-backwardpercorra as conclusões ou insira a primeira ou a última conclusão. Eu os vinculei à opção-tab e shift-tab em ~/.inputrc:

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

O emulador de terminal pode não ser inserido \e[Zquando você pressiona a tecla Shift. Use C-vou cat -vpara ver qual texto é inserido quando você pressiona uma combinação de teclas.

Lri
fonte
De fato, os arquivos são classificados em ordem alfabética, não cronologicamente. Se eu descobrir como classificar cronologicamente, atualizarei com as informações.
dotancohen
2

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

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

Outras idéias: Originalmente, eu queria algo que me desse o primeiro, segundo e terceiro arquivos mais recentes. Uma idéia seria: marcar os locais com um token, por exemplo, "grep x _" e executar uma macro de teclado "\ C-alatest-expansion \ Cm" e "latest-expansion" solicita uma lista de seleção de maldições para escolher os arquivos mais recentes para cada token "_" na linha de comando.

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

Weidenrinde
fonte
Obrigado, isso é útil. Observe que ele insere um literal $(ls -t|head -1)na linha do bash, portanto, ele precisa ser interpretado. Isso o torna menos útil, mas ainda é um bom truque.
dotancohen