Angenommen, ich habe eine Datei mit dem Namen filename123.txt
und es ist die einzelne Datei, die so benannt ist, und ich kann locate
es mit dem Befehl locate filename123
. Und es wird nur diese Datei zurückgegeben.
Jetzt möchte ich es mit vi
/ öffnen vim
. Aber ich möchte nicht zu diesem Speicherort gehen und den vi
Befehl gefolgt von Dateiname eingeben. Hier möchte ich, dass das Ergebnis von locate filename123
an den Befehl vi angehängt wird. Wie kann ich das machen? Ich habe es schon versucht:
locate filename123 | vi
Das geht aber nicht. Und dieser Fehler kommt im Terminal:
santosh@santosh:~$ locate filename123 | vi
Vim: Warning: Input is not from a terminal
Vim: Error reading input, exiting...
Vim: Finished.
command-line
terminal
vim
io-redirection
locate
Santosh Kumar
quelle
quelle
Antworten:
Sie können verwenden
xargs
:Standardmäßig
xargs
werden so wenige Instanzen des angegebenen Befehls wie möglich ausgeführt, wobei so viele Parameter wie möglich gemäß ARG_MAX des Systems übergeben werden .vi
Verwenden Siexargs
die-n
Option ', um die Anzahl der an eine Instanz von übergebenen Parameter zu begrenzen .Verwenden Sie
xargs
die-d
Option ', um Dateinamen mit Leerzeichen zu verarbeiten :Um Dateinamen mit Zeilenumbrüchen zu behandeln, verwenden Sie
xargs
die-0
Option ' zusammen mitlocate
der-0
Option':(Wenn
-0
auf keinem von ihnen eine Option verfügbar ist, überprüfen Sie dies--null
auch oder auf eine andere Weise, um ein Zeichen\000
als Trennzeichen anzugeben .)quelle
locate
Befehls als Eingabe an vi übergeben. Vi erwartet, wie jedes andere Programm, dass der Name der Datei (en) als Argumente verwendet wird.Sie können die Befehlserweiterung verwenden:
Um das
vim
Lesen zu erleichtern , können Sie dies tunvim -
, aber das gibt Ihnen nur die Ausgabe vonlocate
Dateinamenpfaden. Dies kann jedoch funktionieren. Wenn Sie denvim
gf
normalen Befehl verwenden, wird der Pfad geöffnet, auf dem sich der Cursor befindet.Bearbeiten
Bei Dateinamen mit Leerzeichen sollten Sie die oben
xargs
genannte Option oder dievim
oben beschriebene Lösung verwenden. Hinweis, damitgf
Sie arbeiten können, müssen Sie Platz hinzufügen fürisfname
:Dieser Tipp und Alternativen werden hier beschrieben .
Bearbeiten 2
Zitate hinzugefügt und
head
wie von PeterO in den Kommentaren vorgeschlagen .quelle
another
undfile
:(.vi "$(locate filename123)"
... Um sicherzustellen, dass nur ein Dateiname behandelt werden muss:vi "$(locate filename123 |head -n1)"
Der einfachste Weg ist,
locate
als Shell-Substitution zu übergeben , wie:Sie können auch in Betracht ziehen, Dateinamen zum Bearbeiten zu verwenden,
find
anstatt sielocate
zu übergeben. Beispiel:Unter Unix / OSX können Sie verwenden ,
xargs
mit-o
Parametern, wie zB:Oder versuchen Sie unter Linux die folgende Problemumgehung mit:
Wenn Sie verschiedene Befehle verwenden, verwenden Sie die Befehlssubstitution , um dies zu erreichen, z.
Verwenden Sie alternativ GNU , um die Zuweisung
parallel
vonxargs
tty zu erzwingen. Beispiel:Hinweis: Unter
parallel
Unix / OSX funktioniert es nicht, da es unterschiedliche Parameter hat und tty nicht unterstützt.Viele andere beliebte Befehle bieten ebenfalls eine Pseudo-Tty-Zuweisung (wie
-t
inssh
). Suchen Sie daher nach Hilfe.Ein anderer Vorschlag wäre, eine
vipe
(Vim-Befehlspipe) oder das folgende einfache Skript zu verwenden:Verbunden:
quelle