So analysieren Sie Dateinamen in Bash richtig

Inhalt

Bash-Shell

Die Benennungskonventionen für Bash-Dateien sind sehr umfangreich und es ist einfach, ein Skript oder eine Zeile zu erstellen, die Dateinamen falsch analysiert. Lernen Sie, Dateinamen richtig zu parsen und, da, Stellen Sie sicher, dass Ihre Skripte wie beabsichtigt funktionieren.

Das Problem des korrekten Parsens von Dateinamen in Bash

Wenn Sie Bash schon eine Weile verwenden und in seiner reichhaltigen Bash-Sprache schreiben, Sie sind wahrscheinlich auf einige Probleme beim Analysieren von Dateinamen gestoßen. Schauen wir uns ein einfaches Beispiel an, was schief gehen kann:

Berühren Sie 'a
> B'

Legen Sie eine Datei mit einem CR-Zeichen im Dateinamen fest

Hier erstellen wir eine Datei mit a CR (Autorückgabe) Geben Sie es ein, indem Sie nach dem die Eingabetaste drücken a. Die Benennungskonventionen für Bash-Dateien sind sehr umfangreich, und obwohl es irgendwie cool ist, wir können solche Sonderzeichen in einem Dateinamen verwenden, Mal sehen, wie sich diese Datei verhält, wenn wir versuchen, einige Aktionen darauf auszuführen:

ls | xargs rm

Das Problem beim Versuch, einen Dateinamen zu verarbeiten, der CR . enthält

Das ist nicht funktionsfähig. xargs nimmt die Eingabe von ls (durch ihn | Pipeline) und übergebe es an rm, Aber bei der Prozedur ist etwas schief gelaufen!

Was schief gelaufen ist, ist, dass die Ausgabe von ls wird wörtlich genommen von xargs, und das 'eingeben’ (CR – Autorückgabe) innerhalb des Dateinamens wird gesehen von xargs wie ein echter Endcharakter, kein CR weitergegeben werden rm so wie es sein sollte.

Lassen Sie uns dies auf eine andere Weise veranschaulichen:

ls | xargs -I{} echo '{}|'

Zeigen, wie xargs das CR-Zeichen als neue Zeile sieht und die Daten darüber aufteilt

Es ist klar: xargs Sie verarbeiten die Eingabe als zwei einzelne Zeilen, Teilen des ursprünglichen Dateinamens in zwei Teile. Auch wenn wir Platzprobleme durch elegante Analyse mit Durst beheben müssten, Bald würden wir auf andere Probleme stoßen, als wir anfingen, andere Sonderzeichen als Leerzeichen zu verwenden., hintere Balken, Anführungszeichen und mehr.

touch 'a
b'
touch 'a b'
touch 'ab'
touch 'a"b'
touch "a'b"
ls

Alle Arten von Sonderzeichen in Dateinamen.

Auch wenn Sie ein erfahrener Bash-Entwickler sind, Möglicherweise werden Sie erschüttert, wenn Sie Dateinamen wie diesen sehen, da es sehr komplex wäre, für die gängigsten Bash-Tools, Scannen Sie diese Dateien korrekt. Sie müssten alle möglichen Kettenmodifikationen vornehmen, damit dies funktioniert.. Mit anderen Worten, es sei denn, Sie haben das geheime Rezept.

Bevor wir darauf eingehen, Es gibt noch eine Sache, etwas, das Sie wissen sollten, Sie können bei der Analyse darauf stoßen ls Produktion. Wenn Sie eine Farbcodierung für Verzeichniseinträge verwenden, die standardmäßig in Ubuntu aktiviert ist, es ist einfach, einen weiteren Satz von auszuführen ls Analyseprobleme.

Diese hängen nicht wirklich damit zusammen, wie die Dateien benannt sind, sondern wie die Dateien als Ausgabe dargestellt werden von ls. das ls Die Ausgabe enthält Hex-Codes, die die in Ihrem Terminal zu verwendende Farbe darstellen.

Um diese zu vermeiden, benutz einfach --color=never als Option für ls:
ls --color=never.

Und Minze 20 (ein großartiges von Ubuntu abgeleitetes Betriebssystem), dieses Problem scheint gelöst, obwohl es möglich ist, dass das Problem in vielen anderen Versionen von Ubuntu oder älter noch vorhanden ist, etc. Ich habe dieses Problem Mitte August gesehen 2020 unter Ubuntu.

Auch wenn Sie keine Farbcodierung für Ihre Verzeichniseinträge verwenden, Ihr Skript wird wahrscheinlich auf anderen Systemen ausgeführt, die Ihnen nicht gehören oder von Ihnen verwaltet werden. In diesem Fall, Sie sollten diese Option auch verwenden, um zu verhindern, dass Benutzer dieses Computers auf das beschriebene Problem stoßen.

Zurück zu unserem Geheimrezept, Mal sehen, wie wir sicherstellen können, dass wir keine Probleme mit den Sonderzeichen in den Bash-Dateinamen haben. Die angegebene Antwort vermeidet jegliche Verwendung von ls, das solltest du generell vermeiden, Farbcodierungsprobleme sind daher ebenfalls nicht anwendbar.

Es gibt immer noch Zeiten, in denen ls Die Analyse ist schnell und bequem, aber es wird immer kompliziert und wahrscheinlich "schmutzig" sein’ sobald Sonderzeichen eingegeben werden, ganz zu schweigen davon, dass sie unsicher sind (Sonderzeichen können verwendet werden, um alle Arten von Problemen einzuführen).

Das Geheimrezept: NULL-Terminierung

Die Entwickler von Bash-Tools haben dieses Problem viele Jahre zuvor erkannt und uns zur Verfügung gestellt: NULL Beendigung!

Was ist es NULL Abschlussfragen? Überlegen Sie, wie in den obigen Beispielen, CR (die buchstäblich geraten in) war die endende Hauptfigur.

Wir haben auch gesehen, wie Sie Sonderzeichen wie Anführungszeichen verwenden können, Leerzeichen und umgekehrte Schrägstriche in Dateinamen, obwohl sie spezielle Funktionen haben, wenn es um andere Bash-Textanalyse- und -modifikationswerkzeuge wie sed geht. Vergleichen Sie dies nun mit dem -0 Option a xargs, von man xargs:

-0, -Null Eingabeelemente enden mit einem Nullzeichen anstelle eines Leerzeichens, und die Anführungszeichen und der Backslash sind nichts Besonderes (alle zeichen sind wörtlich genommen). Ende der Dateizeichenfolge deaktivieren, was wie jedes andere Argument behandelt wird. Nützlich, wenn Eingabeelemente Leerzeichen enthalten können, Anführungszeichen oder umgekehrte Schrägstriche. Die GNU find -print0 Option erzeugt eine passende Eingabe für diesen Modus.

Und der -print0 Option a find, von man find:

-fprint0 archivo Sicher; druckt den vollständigen Dateinamen auf die Standardausgabe, gefolgt von einem Nullzeichen (anstelle des Newline-Zeichens, das -print verwendet). Dadurch können Programme, die Suchausgaben verarbeiten, Dateinamen, die neue Zeilen oder andere Arten von Leerzeichen enthalten, korrekt interpretieren.. Diese Option entspricht der Option -0 de xargs.

das Sicher; Hier bedeutet Wenn die Option angegeben ist, Folgendes ist wahr;. Interessant sind auch die beiden klaren Warnungen, die in anderen Teilen derselben Handbuchseite gegeben werden:

  • Wenn Sie die Ausgabe von find an ein anderes Programm weiterleiten und die geringste Chance besteht, dass die gesuchten Dateien eine neue Zeile enthalten, dann sollten Sie ernsthaft erwägen, die Option -print0 anstelle von -print zu verwenden. Informationen zum Umgang mit ungewöhnlichen Zeichen in Dateinamen finden Sie im Abschnitt UNGEWÖHNLICHE DATEINAMEN..
  • Wenn Sie die Suche in einem Skript verwenden oder in einer Situation, in der übereinstimmende Dateien beliebige Namen haben können, Sie sollten die Verwendung von -print0 anstelle von -print in Betracht ziehen.

Diese klaren Warnungen erinnern uns daran, dass die Analyse von Dateinamen in bash, Und es ist, ein kompliziertes Geschäft. Trotz dieses, mit den richtigen Alternativen für find, nämlich -print0, und xargs, nämlich -0, Alle unsere Sonderzeichen, die Dateinamen enthalten, können korrekt gescannt werden:

ls
find . -name 'a*' -print0 
find . -name 'a*' -print0 | xargs -0 ls
find . -name 'a*' -print0 | xargs -0 rm

Die Lösung: find -print0 und xargs -0

Zuerst überprüfen wir unsere Verzeichnisliste. Alle unsere Dateinamen, die Sonderzeichen enthalten, sind da. Als nächstes machen wir ein einfaches find ... -print0 um die Ausgabe zu sehen. Wir beobachten, dass die Strings NULL fertig (mit dem NULL Ö – der gleiche Charakter – nicht sichtbar).

Wir stellen auch fest, dass es nur einen gibt CR am Ausgang, das passt zur Single CR die wir im ersten Dateinamen eingetragen hatten, zusammengestellt von ein gefolgt von geraten in gefolgt von B.

Beenden, die Ausgabe führt keine neue Zeile ein (die auch enthält CR) vor der Rückgabe $ Klemmenanzeige, da waren die ketten NULL und nein CR fertig. Wir drücken die Eingabetaste im $ Terminalaufforderung, um die Dinge ein wenig zu erklären.

Dann fügen wir hinzu xargs mit dem -0 Optionen, was ermöglicht xargs um die zu handhaben NULL den Eintrag richtig abgeschlossen. Wir sehen, dass die Eingabe übergeben und empfangen wurde von ls es ist klar und es gibt keine Änderung der Texttransformation.

Zum Abschluss versuchen wir es noch einmal mit unserem rm Befehl, und diesmal für alle dateien, einschließlich des Originals mit den CR mit denen wir Probleme hatten. das rm funktioniert super und es gibt keine fehler oder parsingprobleme. Exzellent!

Ende

Wir haben gesehen, wie wichtig, in mehreren Fällen, Dateinamen in der bash richtig analysieren und verarbeiten. Beim Erlernen des Gebrauchs find richtig ist etwas anspruchsvoller als nur zu verwenden ls, die Vorteile, die es bietet, können sich am Ende auszahlen. Mehr Sicherheit und störungsfrei mit Sonderzeichen.

Wenn dir dieser Beitrag gefallen hat, Vielleicht möchten Sie auch lesen So benennen Sie Dateien in numerischen Dateinamen in Linux um, zeigt eine interessante und etwas komplexe find -print0 | xargs -0 Stellungnahme. Genießen!

Abonniere unseren Newsletter

Wir senden Ihnen keine SPAM-Mail. Wir hassen es genauso wie du.