Completa automaticamente il file più recente


13

Ho un processo che crea file di testo i cui nomi di file sono basati sul timestamp del loro momento di creazione:

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

Come potrei completare automaticamente il nome file dell'ultimo file creato , ovvero il file con l'ultimo mtime? Non è possibile utilizzare il completamento con Tab per questi file poiché quasi tutti i caratteri nel nome file sono condivisi con un altro file. Spero di trovare una scorciatoia (come quella Alt .che completa automaticamente l'ultimo argomento dell'ultimo comando). Sono riuscito a inventare i seguenti alias che è grande per VIM, ma mi piacerebbe sapere se un collegamento generico esiste che potrei usare con kde-open, sqlite3e altre applicazioni.

alias lastest="vim `ls -t | grep -vE "^total [0-9]*$" | head -n1`"


Avendo letto tutto ciò, la domanda sembra non avere ancora una risposta soddisfacente su come avere una scorciatoia da tastiera per inserire l'ultimo percorso di file (un completamento alla bash e, si spera, anche scorrere in ordine cronologico) nella shell bash?
Roman Susi,

@RomanSusi: questa risposta più vicina è di Weidenrinde, ma inserisce solo un valore letterale $(ls -t|head -1)nella riga. Pertanto, non andare in bicicletta. In assenza di una risposta soddisfacente, ho accettato la risposta che mi ha insegnato di più e offre la massima utilità.
dotancohen

Sicuro. Mi è appena venuto in mente che potrebbe essere una bella funzionalità shell e mi chiedevo perché nessuno lo avesse ancora implementato.
Roman Susi,

Risposte:


6

Basta rimuovere viml'alias. Fai qualcosa del genere:

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

È quindi possibile utilizzare qualsiasi programma per aprire gli ultimi file:

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

eccetera.

Tuttavia, questo si interromperà se i nomi dei tuoi file hanno spazi o caratteri strani, motivo per cui non dovresti mai analizzarels . Un modo migliore sarebbe qualcosa di simile (aggiungi questo al tuo .bashrc):

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

Questa funzione eseguirà qualsiasi comando impartito come argomento e passerà il risultato della findchiamata (il file più recente) a quel comando. Quindi, puoi fare cose come:

latest emacs
latest less

Se devi essere in grado di fare cose come mv $(latest) foo/provare questa, invece:

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
}

Quindi, per copiare l'ultimo file in bar/, lo faresti

latest cp bar

E puoi ancora fare latest emacscome prima.


Grazie, ci sono alcune cose che posso imparare qui.
dotancohen,

Consiglierei alias latest='\ls -tr | tail -n 1': questo funzionerà se si dispone di lsalias.
domen,

5

Puoi facilmente configurarlo inzsh , ad es. Con qualcosa del genere:

zstyle ':completion:*' file-sort date

(puoi anche cambiare la linea in modo tale che questo stile sia usato solo per determinati schemi di nomi di file)

zsh è molto simile a bash, probabilmente potresti chiamarlo un superset di bash - saggio di funzionalità / utilizzo.

Ma forse bash ha una funzione simile.


Grazie, va benissimo. Per alcuni motivi preferisco non spostarmi, zshma se mai lo avessi, ho aggiunto questo segnalibro!
dotancohen,

Grazie per avermi fatto conoscere zsh!
dotancohen,

3

Poiché anche il file più recente viene ordinato per ultimo, è possibile utilizzare menu-complete-backward. menu-completee menu-complete-backwardscorrere tra i completamenti o inserire il primo o l'ultimo completamento. Li ho associati a tab opzione e maiusc a tab in ~/.inputrc:

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

L'emulatore di terminale potrebbe non essere inserito \e[Zquando si preme il tasto Maiusc. Utilizzare C-vo cat -vper visualizzare il testo inserito quando si preme una combinazione di tasti.


In effetti, i file sono ordinati alfabeticamente, non in ordine cronologico. Se capisco come ordinare in ordine cronologico, aggiornerò con le informazioni.
dotancohen,

2

Lo sfondo della domanda è la velocità di utilizzo. Trovo la macro di tastiera più appropriata. Aggiungi a ~/.inputrc:

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

Altre idee: originariamente, volevo qualcosa che mi desse il 1 °, 2 °, 3 ° file più recente. Un'idea sarebbe, per contrassegnare i luoghi con un token, ad esempio "grep x _", quindi eseguire una macro di tastiera "\ C-alatest-expansion \ Cm" e "ultima espansione" richiede un elenco di selezione maledizioni da cui scegliere i file più recenti per ogni token "_" nella riga di comando.

Considero questa una domanda importante, perché un vantaggio residuo della GUI rispetto a SHELL è per me la selezione di file e directory utilizzati / creati di recente. autojumpaiuta un po 'per le directory, manca una soluzione per i file.


Grazie, è utile. Nota che inserisce un valore letterale $(ls -t|head -1)nella riga bash, quindi deve essere interpretato. Ciò lo rende meno utile, ma è comunque un bel trucco.
dotancohen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.