Neueste Datei automatisch vervollständigen

13

Ich habe einen Prozess, der Textdateien erstellt, deren Dateinamen auf dem Zeitstempel ihres Erstellungszeitpunkts basieren:

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

Wie kann ich den Dateinamen der zuletzt erstellten Datei , dh der Datei mit der neuesten Mtime, automatisch vervollständigen ? Es gibt keine Möglichkeit, die Tabulatorvervollständigung für diese Dateien zu verwenden, da fast jedes Zeichen im Dateinamen für eine andere Datei freigegeben ist. Ich hoffe, eine Abkürzung zu finden (zum Beispiel, Alt .die das letzte Argument des letzten Befehls automatisch vervollständigt). Ich habe es geschafft , die folgende alias auszuhecken , die für groß ist VIM, aber ich würde gerne wissen , ob ein Mehrzweck Verknüpfung besteht , dass ich mit nutzen könnten kde-open, sqlite3und andere Anwendungen.

alias lastest="vim `ls -t | grep -vE "^total [0-9]*$" | head -n1`"
dotancohen
quelle
Nachdem Sie das alles gelesen haben, scheint die Frage noch nicht zufriedenstellend beantwortet zu sein, wie Sie eine Tastenkombination zum Einfügen des neuesten Dateipfads (a la bash-Vervollständigung und hoffentlich auch zum Durchlaufen in chronologischer Reihenfolge) in die bash-Shell verwenden können.
Roman Susi
@RomanSusi: Diese Antwort stammt von Weidenrinde, fügt jedoch nur ein Literal $(ls -t|head -1)in die Zeile ein. Daher kein Radfahren. In Ermangelung einer befriedigenden Antwort akzeptierte ich die Antwort, die mich am meisten lehrte und am nützlichsten war.
Dotancohen
Sicher. Mir ist gerade eingefallen, dass es sich um ein cooles Shell-Feature handeln könnte, und ich habe mich gefragt, warum es noch niemand implementiert hat.
Roman Susi

Antworten:

6

Entfernen Sie einfach die vimaus dem Alias. Mach so etwas:

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

Sie können dann ein beliebiges Programm verwenden, um die neuesten Dateien zu öffnen:

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

etc.

Dies funktioniert jedoch nicht, wenn Ihre Dateinamen Leerzeichen oder seltsame Zeichen enthalten. Aus diesem Grund solltenls Sie diese niemals analysieren . Ein besserer Weg wäre so etwas (füge dies zu deinem hinzu .bashrc):

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

Diese Funktion führt jeden Befehl aus, den Sie als Argument angeben, und übergibt das Ergebnis des findAufrufs (die neueste Datei) an diesen Befehl. So können Sie Dinge tun wie:

latest emacs
latest less

Wenn Sie in der Lage sein müssen, Dinge wie mv $(latest) foo/diesen zu tun, versuchen Sie stattdessen diesen:

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
}

Dann, um die neueste Datei zu kopieren bar/, würden Sie tun

latest cp bar

Und Sie können es immer noch latest emacsauf die gleiche Weise tun wie zuvor.

terdon
quelle
Vielen Dank, es gibt einige Dinge, die ich hier lernen kann.
Dotancohen
Ich würde empfehlen alias latest='\ls -tr | tail -n 1'- dies wird funktionieren, wenn Sie lsAlias ​​haben.
Domen
5

Sie können dies einfach konfigurierenzsh , z. B. mit so etwas:

zstyle ':completion:*' file-sort date

(Sie können die Zeile auch so ändern, dass dieser Stil nur für bestimmte Dateinamenmuster verwendet wird.)

zsh ist bash sehr ähnlich, man könnte es wahrscheinlich als eine Obermenge von bash bezeichnen - je nach Funktion / Verwendung.

Aber vielleicht hat bash eine ähnliche Funktion.

maxschlepzig
quelle
Danke, das ist großartig. Aus ein paar Gründen ziehe ich es vor, nicht zu ziehen, zshaber wenn ich es jemals tue, habe ich dieses Lesezeichen!
Dotancohen
Vielen Dank, dass Sie mich vorgestellt haben zsh!
Dotancohen
3

Da die neueste Datei auch zuletzt sortiert wird, können Sie verwenden menu-complete-backward. menu-completeund menu-complete-backwardblättern Sie durch die Abschlüsse oder fügen Sie den ersten oder letzten Abschluss ein. Ich habe sie an Options- und Shift-Tab gebunden in ~/.inputrc:

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

Ihr Terminal-Emulator wird möglicherweise nicht eingefügt, \e[Zwenn Sie die Umschalttaste drücken. Verwenden Sie C-voder, um cat -vzu sehen, welcher Text beim Drücken einer Tastenkombination eingefügt wird.

Lri
quelle
Tatsächlich werden Dateien alphabetisch und nicht chronologisch sortiert. Wenn ich herausfinde, wie ich chronologisch sortieren soll, aktualisiere ich die Informationen.
Dotancohen
2

Hintergrund für die Frage ist die Nutzungsgeschwindigkeit. Ich finde ein Tastaturmakro am besten geeignet. Hinzufügen zu ~/.inputrc:

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

Weitere Ideen: Ursprünglich wollte ich etwas, das mir die 1., 2., 3. neueste Datei gibt. Eine Idee wäre, die Stellen mit einem Token zu markieren, zB "grep x _", dann ein Tastaturmakro "\ C-alatest-expansion \ Cm" auszuführen und "latest-expansion" eine Fluchauswahlliste zur Auswahl aufzufordern Die neuesten Dateien für jedes "_" -Token in der Befehlszeile.

Ich halte dies für eine wichtige Frage, da ein verbleibender Vorteil der GUI gegenüber SHELL für mich die Auswahl der zuletzt verwendeten / erstellten Dateien und Verzeichnisse ist. autojumphilft etwas für verzeichnisse, eine lösung für dateien fehlt.

Weidenrinde
quelle
Danke, das ist hilfreich. Beachten Sie, dass ein Literal $(ls -t|head -1)in die Bash-Zeile eingefügt wird und daher interpretiert werden muss. Das macht es weniger nützlich, aber es ist immer noch ein schöner Trick.
Dotancohen