Zsh und vils: Leerzeichen von Dateinamen in Vim durch Unterstriche ersetzen

Ich habe vor einiger Zeit aus Neugier die Bash mit Zsh ersetzt und dabei auf die sehr nützliche Konfiguration von .zshrc und .zshrc.local von Grml zurückgegriffen. Seitdem habe ich auf jedem Rechner mit Ausnahme des Toshiba Satellite 220cs, dort läuft immer noch die ash von Busybox, die Shell ausgetauscht.
An dieser Stelle will ich nicht lange über Zsh schwärmen und davon erzählen, warum euer Leben sinnlos ist, solange ihr Zsh nicht selbst ausprobiert habt. (Es gibt genug Seiten, die das tun.) Nein, womöglich kommt man als normaler Mensch auch wunderbar mit der Bash aus, sowie das bei mir jahrelang der Fall war. Dennoch...der Austausch war einfach und ich konnte mir das Installieren der bash-completion und die farbenfrohe Veränderung der Bash dank Grml sparen.
Abgesehen davon, dass ich nun eine phänomenale Tab-Vervollständigung habe und nicht mehr nur eine großartige, dass meine Tippfehler praktischerweise korrigiert werden und ich mit Hilfe von vils problemlos Dateien und Ordner in Vim umbenennen kann, musste ich mich bisher auch kaum umstellen.
Mehr über vils lässt sich auf freshports.org erfahren, wo es zwei Links zum Herunterladen dieses kleinen Skripts gibt.

Das Skript sollte man mit chmod u+x ausführbar machen und am besten gleich nach /usr/local/bin kopieren, damit man es im $PATH benutzen kann.
Die Bedienung ist simpel. Man führt es im Verzeichnis aus, indem man die Dateien oder Unterverzeichnisse umbenennen möchte, wodurch alle Namen in Vim importiert werden und dann beliebig geändert werden können. Speichert man danach, werden alle Dateien und Ordner dementsprechend umbenannt.
Als Hinweise werden im Skript genannt:

  1. Man solle die Nummern vor jeder Zeile nicht entfernen.
  2. Wenn man eine Zeile löscht und abspeichert, wird die Datei nicht gelöscht.
  3. Man kann jedes Zeichen zum Ersetzen benutzen, nur muss man doppelt angeben.
  4. Es wird vor dem Überschreiben gleichlautender Dateinamen gefragt.
  5. Man kann den Dateinamen von zwei oder mehr Dateien nicht austauschen.
  6. Man kann gezielt einzelne oder mehrere Dateinamen in Vim laden, indem sie auf der Kommandozeile übergeben werden. (vils datei1 datei2 datei3)

Leerzeichen mit Unterstriche tauschen

Ich entferne im Visual-Block-Modus immer die vorangestellten Nummern und füge sie nach der Umbenennung wieder ein. STRG+v, dann d zum Löschen und später p zum Einfügen. Das ist ein Weg um zu verhindern, dass das erste Leerzeichen zwischen der Nummer und dem Dateinamen durch einen Unterstrich ersetzt wird. Danach genügt im Normalmodus:
:%s/ /_/g
Nachdem die Nummern wieder eingefügt und alles abgespeichert wurde, sind sämtliche Leerzeichen durch Unterstriche ersetzt worden.
Wenn man sich nun noch ein paar Reguläre Ausdrücke vorstellt, lässt sich so ziemlich jedes Umbenennungsproblem innerhalb von Vim mit Hilfe von vils lösen und man kann auf diese Lösung, die aber ebenso gut funktioniert, verzichten.

Der Stromeditor sed und ein kleines Skript namens vils

Vor zwei Monaten hatte ich kurz zwei Methoden abseits grafischer Programme vorgestellt, wie man mit Hilfe der Bash und dem Texteditor VIM mehrere Dateien umbenennen kann. Als ich wenige Wochen später mit einem Freund über das gleiche Thema sprach und dabei die eher ungewöhnliche VIM Methode vorstellte, musste ich mir sagen lassen: "Mit einem Texteditor? Das ist ja umständlich. Warum hast du nicht sed benutzt?" 😐 Pah, gibt es denn keine Sonderpunkte mehr für kreative Lösungen. 😉
Mein Ziel mit der Kategorie "Leben auf der Konsole" ist weniger, Abhandlungen über Programmiersprachen und gute Praxistipps für Systemadministratoren zu schreiben. Ich glaube letztere würden sich sowieso langweilen, während andere alle Vorurteile über den typischen Linuxnutzer bestätigt sähen. Ich widme dem Ganzen trotzdem gerne ab und zu meine Aufmerksamkeit, weil sehr viele Probleme sich mit Linux auf unterschiedliche Weise schon von Haus aus lösen lassen. Außerdem habe ich mit der Zeit festgestellt, dass einfache Lösungen, Eleganz und Effektivität sich bei Konsolenanwendungen nicht zwangsläufig ausschließen müssen, eher das Gegenteil ist der Fall.
Bei GNU sed verhält es sich ähnlich. Es gibt schon tonnenweise gute Informationen im Internet. Als Lektüre empfehle ich z.B. sed, awk und reguläre Ausdrücke.
Um das alte Beispiel mit dem Umwandeln von Groß- in Kleinschreibung aufzugreifen, das lässt sich mit sed so lösen:
Als Testlauf

for DATEI in *.jpg ; do NEUEDATEI=`echo $DATEI | sed -e 's/(.*)/L1/'` ; echo "$DATEI wird umbenannt in $NEUEDATEI" ; done

Und so gehts richtig

for DATEI in *.jpg ; do NEUEDATEI=`echo $DATEI | sed -e 's/(.*)/L1/'` ; mv "$DATEI" $NEUEDATEI ; done

Mehr Beispiele gibt es auch hier und hier. Wie der letzte Link zeigt, gibt es tatsächlich mehr als nur eine Möglichkeit Dateinamen von Groß- nach Kleinschreibung oder umgekehrt zu ändern.
Jeder kann nun für sich entscheiden, ob die VIM-Methode oder sed einfacher war. Bei wenigen Dateien verschwende ich auf so etwas sowieso keine Anstrengungen und ändere es schnell per Hand. Wenn aber Tausende von Dateien geändert werden müssen, lohnt sich der Blick auf sed und eine simple Schleifenkonstruktion.
In meinem alten Beitrag hat andre noch auf ein kleines Skript namens vils hingewiesen, welches es auch direkt für Arch Linux in AUR und für FreeBSD oder direkt als Download zu geben scheint. Ruft man vils auf, werden automatisch alle Dateinamen in einem Verzeichnis im Editor der Wahl angezeigt. Dort können sie verändert werden und werden nach dem Abspeichern im Editor exakt so umbenannt. Das Skript nimmt einem also das ls | vim - und das Hinzufügen von Shell Befehlen wie mv innerhalb von vim ab. Leider scheint es nur für die zsh Shell zu funktionieren, ist aber eine praktische Sache, wenn man oft Dateien umändern muss und dafür gerne einen vielseitigen Texteditor wie Vim benutzt.
Fazit: Es gibt wie so oft immer mehr als eine Lösung für das gleiche Problem.