Ich verwende find für alle Dateien im Verzeichnis, daher erhalte ich eine Liste der Pfade. Ich brauche jedoch nur Dateinamen. dh ich bekomme ./dir1/dir2/file.txt
und ich will bekommenfile.txt
266
In GNU können find
Sie dafür -printf
Parameter verwenden, z.
find /dir1 -type f -printf "%f\n"
-o
eine niedrigere Priorität als impliziert hat-a
, so dass Sie häufig Ihre-o
Argumente gruppieren möchten )Wenn Ihr Fund keine Option -printf hat, können Sie auch den Basisnamen verwenden:
quelle
... {} ';'
Verwenden Sie
-execdir
diese Option, in der die aktuelle Datei automatisch gespeichert ist{}
, zum Beispiel:Sie können auch
$PWD
anstelle von verwenden.
(auf einigen Systemen wird vorne kein zusätzlicher Punkt erzeugt).Wenn Sie noch einen zusätzlichen Punkt haben, können Sie alternativ Folgendes ausführen:
Bei Verwendung
+
anstelle von;
wird dann{}
bei jedem Aufruf des Dienstprogramms durch so viele Pfadnamen wie möglich ersetzt. Mit anderen Worten, es werden alle Dateinamen in einer Zeile gedruckt.quelle
./filename
stattfilename
. Abhängig von Ihren Bedürfnissen kann es in Ordnung sein oder auch nicht.$PWD
statt.
.Wenn Sie GNU verwenden, finden Sie
Oder Sie können eine Programmiersprache wie Ruby (1.9+) verwenden.
Wenn Sie Lust auf eine Bash-Lösung (mindestens 4) haben
quelle
Wenn Sie eine Aktion nur für den Dateinamen ausführen möchten,
basename
kann die Verwendung schwierig sein.Zum Beispiel dies:
wird nur den Basisnamen wiedergeben
/my/found/path
. Nicht das, was wir wollen, wenn wir den Dateinamen ausführen wollen.Aber das kannst du dann
xargs
die Ausgabe. Zum Beispiel, um die Dateien in einem Verzeichnis basierend auf Namen in einem anderen Verzeichnis zu beenden:quelle
find ~/clang+llvm-3.3/bin/ -type f -exec basename {} \;
Auf Mac (BSD
find
) verwenden:quelle
-exec
und-execdir
sind langsam,xargs
ist König.xargs
Die Parallelität hilft auch.Lustigerweise kann ich den letzten Fall von
xargs
ohne nicht erklären-n1
. Es gibt das richtige Ergebnis und es ist das schnellste¯\_(ツ)_/¯
(
basename
Dauert nur 1 Pfad Argument aberxargs
, ohne sie alle (tatsächlich 5000) senden-n1
. Nicht die Arbeit an Linux und openbsd, nur macOS ...)Einige größere Zahlen von einem Linux-System, um zu sehen, wie
-execdir
hilft, aber immer noch viel langsamer als eine Parallelexargs
:quelle
find
ist es ,-execdir
dass die schnellst als die Schaffung neue Verfahren wird ein relativ teurer Betrieb ist.Ehrlich gesagt
basename
unddirname
Lösungen sind einfacher, aber Sie können dies auch überprüfen:oder
oder
quelle
Wie andere bereits betont haben, können Sie
find
und kombinieren.basename
Standardmäßig wird dasbasename
Programm jedoch jeweils nur auf einem Pfad ausgeführt. Daher muss die ausführbare Datei für jeden Pfad einmal gestartet werden (entwederfind ... -exec
oderfind ... | xargs -n 1
), was möglicherweise langsam ist.Wenn Sie die
-a
Option aktivierenbasename
, können mehrere Dateinamen in einem einzigen Aufruf akzeptiert werden. Dies bedeutet, dass Sie die Pfadexargs
ohne die Option-n 1
zu einer weitaus geringeren Anzahl von Aufrufen von gruppieren könnenbasename
, was effizienter sein sollte.Beispiel:
Hier habe ich das
-print0
und aufgenommen-0
(das zusammen verwendet werden sollte) eingefügt, um mit Leerzeichen in den Namen von Dateien und Verzeichnissen fertig zu werden.Hier ist ein Zeitvergleich zwischen
xargs basename -a
undxargs -n1 basename
Versionen. (Um einen Vergleich mit ähnlichen Daten zu ermöglichen, werden die hier angegebenen Timings nach einem ersten Dummy-Lauf angezeigt, sodass beide ausgeführt werden, nachdem die Dateimetadaten bereits in den E / A-Cache kopiert wurden.) Ich habe die Ausgabe an weitergeleitetcksum
In beiden Fällen nur, um zu demonstrieren, dass die Ausgabe unabhängig von der verwendeten Methode ist.Wie Sie sehen, ist es wesentlich schneller, nicht
basename
jedes Mal zu starten .quelle
basename
mehrere Dateinamen akzeptiert werden, ohne dass zusätzliche Befehlszeilenargumente erforderlich sind. Die Verwendung von-a
hier ist unter Linux. (basename --version
sagt es mirbasename (GNU coreutils) 8.28
.)Ich habe eine Lösung gefunden (auf der Seite makandracards), die nur den neuesten Dateinamen enthält:
(Dank geht an Arne Hartherz)
Ich habe es benutzt für
cp
:quelle