386 Stimmen

Wie kann man mit Linux 'find' nur den Dateinamen ermitteln?

Ich verwende find für alle Dateien im Verzeichnis, so dass ich eine Liste von Pfaden erhalte. Ich benötige jedoch nur Dateinamen, d.h. ich erhalte ./dir1/dir2/file.txt und ich möchte die file.txt

8voto

spectrum Punkte 319

Auf dem Mac (BSD find ) verwenden:

find /dir1 -type f -exec basename {} \;

6voto

Freeman Punkte 3434

Ehrlich gesagt basename y dirname Lösungen sind einfacher, aber Sie können sich auch diese ansehen:

find . -type f | grep -oP "[^/]*$"

ou

find . -type f | rev | cut -d '/' -f1 | rev

ou

find . -type f | sed "s/.*\///"

5voto

minusf Punkte 942

-exec y -execdir sind langsam, xargs ist König.

$ alias f='time find /Applications -name "*.app" -type d -maxdepth 5'; \
f -exec basename {} \; | wc -l; \
f -execdir echo {} \; | wc -l; \
f -print0 | xargs -0 -n1 basename | wc -l; \
f -print0 | xargs -0 -n1 -P 8 basename | wc -l; \
f -print0 | xargs -0 basename | wc -l

     139
    0m01.17s real     0m00.20s user     0m00.93s system
     139
    0m01.16s real     0m00.20s user     0m00.92s system
     139
    0m01.05s real     0m00.17s user     0m00.85s system
     139
    0m00.93s real     0m00.17s user     0m00.85s system
     139
    0m00.88s real     0m00.12s user     0m00.75s system

xargs hilft auch die Parallelität.

Komischerweise kann ich mir den letzten Fall von xargs ohne -n1 . Es liefert das richtige Ergebnis und ist das schnellste ¯\_()_/¯

( basename benötigt nur 1 Pfadargument, aber xargs wird sie alle (eigentlich 5000) senden, ohne -n1 . funktioniert nicht unter Linux und openbsd, nur unter macOS...)

Einige größere Zahlen von einem Linux-System, um zu sehen, wie -execdir hilft, ist aber immer noch viel langsamer als eine parallele xargs :

$ alias f='time find /usr/ -maxdepth 5 -type d'
$ f -exec basename {} \; | wc -l; \
f -execdir echo {} \; | wc -l; \
f -print0 | xargs -0 -n1 basename | wc -l; \
f -print0 | xargs -0 -n1 -P 8 basename | wc -l

2358
    3.63s real     0.10s user     0.41s system
2358
    1.53s real     0.05s user     0.31s system
2358
    1.30s real     0.03s user     0.21s system
2358
    0.41s real     0.03s user     0.25s system

-3voto

jazzinka Punkte 11

Ich habe eine Lösung gefunden (auf der Makandracards-Seite), die nur den neuesten Dateinamen angibt:

ls -1tr * | tail -1

(Dank geht an Arne Hartherz)

Ich benutzte es für cp :

cp $(ls -1tr * | tail -1) /tmp/

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X