Linux-Suchbefehl für Dateinamen ohne Erweiterung für unbekannte Erweiterungen

Linux-Suchbefehl für Dateinamen ohne Erweiterung für unbekannte Erweiterungen

Ich verwende gerne den folgenden Befehl zum Drucken von Dateinamen, aber er druckt sie mit Erweiterungen.

find . -type f -printf '%f\n'

In meinem Verzeichnis gibt es viele Dateien mit unterschiedlichen Erweiterungen. Ich habe versucht, --ignore='*.*'sowohl „vorher“ als auch „nachher“ hinzuzufügen -printf, aber es hat nicht funktioniert. Beispiel: Ich habe die Dateien myfile1.txt, myfile2.mp3 usw. Ich möchte, dass es myfile1, myfile2 usw. ausdruckt. Wie mache ich das?

Antwort1

Wenn ich dich richtig verstehe (Habe ich nicht, siehe zweiter Teil der Antwort), möchten Sie die Auflistung von Dateinamen vermeiden, die ein Punktzeichen enthalten.

Dies bewirkt Folgendes:

find . -type f ! -name '*.*'

Das Muster für das Globbing von Dateinamen *.*würde auf jeden Dateinamen passen, der mindestens einen Punkt enthält. Das Vorangegangene !negiert den Sinn der Übereinstimmung, was bedeutet, dass die Pfadnamen, die bis zum Ende durchkommen, diejenigen von Dateien sind, die keine Punkte im Namen haben. Inwirklich uraltShells, möchten Sie vielleicht das !as verlassen \!(oder Ihre Unix-Installation aktualisieren). Das einzige !wird nicht aufrufenbash's Geschichte Erweiterungsanlage.

Um mit GNU nur die Dateinamenkomponente des gefundenen Pfadnamens auszudrucken find:

find . -type f ! -name '*.*' -printf '%f\n'

Mit Standard find(oder GNU, findwas das betrifft):

find . -type f ! -name '*.*' -exec basename {} \;

Bevor Sie dies in einer Befehlsersetzung in einer Schleife verwenden, lesen Sie "Warum ist es eine schlechte Praxis, die Ausgabe von „find“ zu durchlaufen?".


Um alle Dateinamen aufzulisten und gleichzeitig alles nach dem letzten Punkt im Namen zu entfernen ("die Erweiterung entfernen"), können Sie verwenden

find . -type f -exec sh -c '
    for pathname do
        pathname=$( basename "$pathname" )
        printf "%s\n" "${pathname%.*}"
    done' sh {} +

Dadurch werden alle gefundenen Pfadnamen aller Dateien an eine kurze Shell-Schleife gesendet. Die Schleife nimmt jeden Pfadnamen und ruft basenameihn auf, um die Dateinamenkomponente des Pfadnamens zu extrahieren. Anschließend wird die resultierende Zeichenfolge gedruckt, wobei alles nach dem letzten Punkt entfernt wird.

Die Parametererweiterung ${pathname%.*}bedeutet „Entferne die kürzeste übereinstimmende Zeichenfolge .*(einen wörtlichen Punkt, gefolgt von beliebigem Text) vom Ende des Wertes von $pathname“. Dies hätte zur Folge, dass ein Dateinamensuffix nach dem letzten Punkt im Dateinamen entfernt würde.

Weitere Informationen find ... -exec ... {} +finden Sie beispielsweise unter "Die Option -exec von „find“ verstehen".

Antwort2

Unter Linux gibt es keine Dateierweiterung. Ein A .in einem Dateinamen hat keinerlei Bedeutung (obwohl a .alsErsteZeichen in einem Dateinamen identifiziert es als versteckte Datei).

Auch das Überprüfen der Manualpage für findmein System zeigt keine --ignoreOption an.

Wenn Sie jedoch alle Dateien ignorieren möchten, die ein .im Namen haben, können Sie den Operator find's verwenden -not:

find -type f -not -name '*.*' -print

Antwort3

Wie andere bereits angemerkt haben, bedeuten „Erweiterungen“ für Unix-Systeme eigentlich nichts. Aber wir können sie mit einem einfachen sedBefehl aus einer Liste entfernen.

z.B

find * -type f -print | sed 's/\.[^.]*$//'

Wenn es Verzeichnisse gibt und Sie nicht möchten, dass diese in der Liste angezeigt werden, dann

find * -type f -printf "%f\n" | sed 's/\.[^.]*$//'

Für ein einzelnes Verzeichnis können wir einfach lsstattfind

ls | sed 's/\.[^.]*$//'

Antwort4

versuchen

find . -type f \! -name '*.*' -print

Wo

  • \!: nicht (! muss maskiert werden)
  • name '*.*': Dateiname mit Erweiterung

verwandte Informationen