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`"


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.


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.


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.


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.