Wie öffne ich alle Dateien, die das Ergebnis eines ls-Befehls sind?

10

Ich möchte alle Textdateien, die das Ergebnis eines ls-Befehls sind, mit einem Texteditor öffnen. Wie mache ich das?

c0smikdebris
quelle

Antworten:

12

Gilles ist genau richtig , lsist 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 fileteilt 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 xargsoder- forSchleife in der Antwort von jmtd verwenden, je nachdem, ob Sie einen terminalbasierten Editor verwenden, der stdio benötigt.

Caleb
quelle
4
Analysieren Sie nicht die Ausgabe von ls! Verwenden Sie editor-command *.cssusw.
Gilles 'SO - hör auf böse zu sein'
@ Gilles: Ordnungsgemäß bemerkt, danke für den Hinweis auf das Offensichtliche, das wir alle nicht sehen konnten. @ c0smikdebris Beachten Sie, dass ich meine Antwort nur komplett neu geschrieben habe, einschließlich eines Falls, wenn Sie keine offensichtliche Möglichkeit haben, die Dateien anhand ihres Namens als Text abzugleichen.
Caleb
$ () ist das, wonach ich eigentlich gesucht habe. Ich hätte erwähnen sollen, dass ich hier ls als Beispiel verwende. +1 auf beide Antworten.
c0smikdebris
"Mein Lieblingseditor". Keine Notwendigkeit anzugeben, @Caleb, da es mehr oder weniger vom Anfang der Antwort an klar ist, ahahah! Der beste Editor aller Zeiten!
Enrico Maria De Angelis
4

So öffnen Sie alle Dateien mit dem Namen "etwas" .txt(dh *.txt) im aktuellen Verzeichnis:

$EDITOR *.txt

wo $EDITORist Ihr Lieblingseditor, zum Beispiel gedit *.txt, nano *.txt, vim *.txt, emacs *.txtoder was auch immer. Verwenden Sie diese Option *, um alle Dateien im aktuellen Verzeichnis abzugleichen.

Beachten Sie, dass der lsBefehl nicht beteiligt ist. Die Aufgabe von lsbesteht nicht darin, eine Liste von Dateien anzuzeigen, obwohl dies passiert, wenn Sie sie in einem Verzeichnis aufrufen. Wo lsnü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.

Gilles 'SO - hör auf böse zu sein'
quelle
Das ist wirklich editerspezifisch. Es gibt keine Garantie dafür, dass alle Editoren alle ihre freien Befehlszeilenargumente als zu öffnende Dateien behandeln oder das Öffnen von mehr als einer Datei gleichzeitig unterstützen.
Jmtd
2

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 findin 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
jmtd
quelle
2
Analysieren Sie nicht die Ausgabe von ls! Verwenden Sie $EDITOR *.coder for i in *.c; do $EDITOR "$i"; done.
Gilles 'SO - hör auf böse zu sein'
Guter Fang - entsprechend bearbeitet.
Jmtd
Beachten Sie, dass der forFall für viele Dateinamen fehlschlägt, einschließlich des Reduzierens / Änderns von Leerzeichen.
Jmtd
Wie es jetzt geschrieben ist, forfunktioniert der Fall mit jedem Dateinamen (außer möglicherweise Namen, die mit -oder +mit einigen Editoren beginnen; for i in ./*.cwürde das beheben).
Gilles 'SO - hör auf böse zu sein'