Mit 'suchen', um Dateinamen ohne Erweiterung
Ich habe ein Verzeichnis (mit Unterverzeichnissen), von denen ich möchte alle Dateien finden, die eine ".ipynb" - Erweiterung. Aber ich will den 'find' - Befehl nur sendet mir diese Dateinamen ohne die Erweiterung.
Ich kenne den ersten Teil:
find . -type f -iname "*.ipynb" -print
Aber wie mache ich das dann bekommen die Namen ohne das "ipynb" - Erweiterung?
Alle Antworten sehr dankbar...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wieder nur mit Dateinamen ohne die Erweiterung versuchen:
oder:
oder:
jedoch aufrufen
basename
auf jede Datei kann ineffizient sein, so @CharlesDuffy Vorschlag ist:Mit
+
bedeutet, dass wir die übergabe mehrerer Dateien auf jedem bash-Instanz, so dass, wenn die ganze Liste passt in eine einzige Befehlszeile rufen wir die bash nur einmal.Drucken vollständigen Pfad und den Dateinamen (ohne Erweiterung) in der gleichen Linie, versuche:
oder:
Drucken vollständigen Pfad und Namen auf separaten Zeilen:
basename
würde auch wegwerfen, die directory-Komponente.basename
einmal pro Datei scheint eher ineffizient.find . -name '*.ipynb' -exec bash -c 'printf "%s\n" "${@%.*}"' _ {} +
würde nur aufrufen eines shell-pro batch-Dateien, so dass Sie wesentlich weniger overhead.+
?+
bedeutet, dass wir die übergabe mehrerer Dateien auf jedem bash-Instanz --, wenn die ganze Liste passt in eine einzige Befehlszeile rufen wir die bash nur einmal.-exec ... {} +
führt den Befehl mehrmals (jeweils mit einer Teilmenge der Datei-Liste), ebenso wiexargs
tut.Ist hier eine einfache Lösung:
/1
, wie das Muster nicht mehr als einmal (sofern keine eingebetteten Zeilenumbrüche in Dateinamen).Wenn Sie brauchen, um den Namen mit dem Verzeichnis, aber ohne die Erweiterung :
The-o flag gibt nur die übereinstimmenden Teil. Das -P-flag-matches nach Perl reguläre Ausdrücke. Dies ist notwendig, um die lookahead
(?=[.])
Arbeit.Perl-One-Liner
, was Sie wollen
find . | perl -a -F/-lne 'print $F[-1] if /.*.ipynb/g'
Dann nicht dein code
, was Sie nicht wollen
find . | perl -a -F/-lne 'print $F[-1] if !/.*.ipynb/g'
HINWEIS
In Perl muss man zusätzliche
.
. Also dein Muster wäre.*.ipynb
Wenn es keine vorkommen dieser ".ipynb" string, auf eine Datei anderen Namen als suffix, dann können Sie versuchen, diese einfachere Weise mit
tr
:Wenn Sie nicht wissen, dass die Erweiterung oder es sind mehrere können Sie diese:
sowie eine Liste von Dateien ohne Duplikate (ursprünglich mit unterschiedlichen Pfad oder Erweiterung)