
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, find
was 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 basename
ihn 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 find
mein System zeigt keine --ignore
Option 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 sed
Befehl 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 ls
stattfind
ls | sed 's/\.[^.]*$//'
Antwort4
versuchen
find . -type f \! -name '*.*' -print
Wo
\!
: nicht (! muss maskiert werden)name '*.*'
: Dateiname mit Erweiterung