Ich möchte alle Textdateien, die das Ergebnis eines ls-Befehls sind, mit einem Texteditor öffnen. Wie mache ich das?
Ich möchte alle Textdateien, die das Ergebnis eines ls-Befehls sind, mit einem Texteditor öffnen. Wie mache ich das?
Antworten:
Gilles ist genau richtig , ls
ist ein wirklich schlechtes Beispiel, da die Dateinamen-Glob-Erweiterung in der Befehlszeile viel einfacher durchgeführt werden kann, ohne dass sie ls
überhaupt verwendet werden muss! Wenn Ihre sogenannten "Textdateien" Dateinamenerweiterungen haben, um sie zu identifizieren, können Sie Folgendes tun:
editor-command *.txt
Um eine Technik zu demonstrieren, verwenden wir ein komplizierteres Beispiel, das nicht nur mit einer Dateinamenübereinstimmung durchgeführt werden kann, und öffnen Dateien basierend auf dem Inhalt anstelle nur des Dateinamens. Nehmen wir an, Sie wollten alle Dateien öffnen, die die Zeichenfolge "Inhaltstyp" enthalten.
Angenommen, Ihr Editor akzeptiert mehrere Dateinamen und öffnet sie alle gleichzeitig in separaten Puffern oder arbeitet sie nacheinander durch. Sie können einfach Folgendes ausführen:
editor-command $(grep -i content-type)
Angenommen, Sie wissen nicht, ob es sich um Textdateien handelt oder nicht, basierend auf ihren Namen. Sie müssten dann ein anderes Programm verwenden, um sie zu identifizieren, und sie dann basierend auf diesen Daten öffnen. Das Programm file
teilt Ihnen mit, um welche Art von Datei es sich handelt, und Sie können diese Liste nur nach Textdateien durchsuchen und dann nur die passenden Dateinamen wie folgt öffnen:
editor-command $(file -ni * | grep 'text/plain' | cut -d: -f1)
Die Ausgabe der Befehlskette innerhalb des $()
Konstrukts wird als Argument für den Editor verwendet. Ich mache das manchmal in zwei Schritten. Angenommen, ich durchsuche einige Dateien und erhalte eine Liste aller XML-Dateien mit der Zeichenfolge "Inhaltstyp".
find -type f -iname '*xml' | xargs grep -Hi 'content-type' | cut -d: -f1
... und entscheide, dass ich sie öffnen möchte. Ich verwende dann die Verknüpfung zum letzten Befehlsverlauf und mache Folgendes:
vim $(!!)
... um alle Ergebnisse des vorherigen Befehls in vim, meinem Lieblingseditor, zu öffnen.
Wenn Ihr Editor jeweils nur eine Datei akzeptiert und Sie weiterhin Editoren spawnen müssen, müssen Sie eine Variante der xargs
oder- for
Schleife in der Antwort von jmtd verwenden, je nachdem, ob Sie einen terminalbasierten Editor verwenden, der stdio benötigt.
So öffnen Sie alle Dateien mit dem Namen "etwas" .txt
(dh *.txt
) im aktuellen Verzeichnis:
$EDITOR *.txt
wo $EDITOR
ist Ihr Lieblingseditor, zum Beispiel gedit *.txt
, nano *.txt
, vim *.txt
, emacs *.txt
oder was auch immer. Verwenden Sie diese Option *
, um alle Dateien im aktuellen Verzeichnis abzugleichen.
Beachten Sie, dass der ls
Befehl nicht beteiligt ist. Die Aufgabe von ls
besteht nicht darin, eine Liste von Dateien anzuzeigen, obwohl dies passiert, wenn Sie sie in einem Verzeichnis aufrufen. Wo ls
nützlich ist , ist Dateiattribute bei der Anzeige ( bei Änderungen, Berechtigungen, Größe usw.). Um nur eine Reihe von Dateien zu bearbeiten , die einem bestimmten Platzhaltermuster entsprechen, reichen die Globs der Shell aus.
Mit ausreichend fortgeschrittenen Editoren können Sie dies von innen heraus tun. Verwenden Sie in Emacs beispielsweise einfach den normalen Befehl zum Öffnen von Dateien ( C-x C-f
) und geben Sie ein *.txt
.
Wenn Sie auch Dateien in Unterverzeichnissen in zsh oder bash ≥4 abgleichen möchten, können Sie verwenden $EDITOR **/*.txt
.
Dies hängt von einigen Nuancen Ihres Texteditors ab. Fortgeschrittene Editoren können wahrscheinlich mehrere Dateien in einer Instanz über die Befehlszeile öffnen. Nehmen wir zum Beispiel an, Ihr Editor ($ EDITOR in meinen Beispielen unten) kann jeweils nur einen öffnen. Sie sollten die Ausgabe eines geeigneten find
in leiten xargs
. Dies hängt auch davon ab, dass der $ EDITOR das TTY nicht übernimmt (also grafisch verwenden).
find . -maxdepth 1 -type f -name '*.c' -print0 | xargs -r0n 1 $EDITOR
Wenn Sie einen Konsoleneditor verwenden möchten, ist eine Shell-Schleife möglicherweise besser geeignet, schlägt jedoch bei vielen ungewöhnlichen Dateinamen fehl (durch Reduzieren oder Ersetzen von Leerzeichen und verschiedenen anderen Dingen):
for i in *.c; do $EDITOR "$i"; done
$EDITOR *.c
oder for i in *.c; do $EDITOR "$i"; done
.
for
Fall für viele Dateinamen fehlschlägt, einschließlich des Reduzierens / Änderns von Leerzeichen.
for
funktioniert der Fall mit jedem Dateinamen (außer möglicherweise Namen, die mit -
oder +
mit einigen Editoren beginnen; for i in ./*.c
würde das beheben).
editor-command *.css
usw.