it-swarm.com.de

Wie bekomme ich nur Dateinamen mit Linux `find`?

Ich verwende find für alle Dateien im Verzeichnis, damit ich eine Liste der Pfade erhalte. Ich brauche aber nur Dateinamen. d.h. ich erhalte ./dir1/dir2/file.txt und ich möchte file.txt

237
marverix

In GNU find können Sie -printf Parameter dafür, z.B.

find /dir1 -type f -printf "%f\n"
312
SiegeX

Wenn Ihre Suche keine Option -printf enthält, können Sie auch den Basisnamen verwenden:

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

Verwenden Sie -execdir, Das automatisch die aktuelle Datei in {} Enthält, zum Beispiel:

find . -type f -execdir echo '{}' ';'

Sie können auch $PWD Anstelle von . Verwenden (bei einigen Systemen wird kein zusätzlicher Punkt auf der Vorderseite erzeugt).

Wenn Sie noch einen zusätzlichen Punkt haben, können Sie alternativ auch Folgendes ausführen:

find . -type f -execdir basename '{}' ';'

-execdir utility [argument ...] ;

Der -execdir - Primärcode ist identisch mit dem -exec - Primärcode, mit der Ausnahme, dass das Dienstprogramm aus dem Verzeichnis ausgeführt wird, das enthält die aktuelle Datei.

Bei Verwendung von + Anstelle von ; Wird {} Bei jedem Aufruf des Dienstprogramms durch so viele Pfadnamen wie möglich ersetzt. Mit anderen Worten, es werden alle Dateinamen in einer Zeile gedruckt.

23
kenorb

Wenn Sie GNU find

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

Oder Sie können eine Programmiersprache wie Ruby (1.9+) verwenden

$ Ruby -e 'Dir["**/*"].each{|x| puts File.basename(x)}'

Wenn Sie Lust auf eine Bash-Lösung (mindestens 4) haben

shopt -s globstar
for file in **; do echo ${file##*/}; done
21
kurumi

Wenn Sie eine Aktion nur für den Dateinamen ausführen möchten, kann die Verwendung von basename schwierig sein.

Zum Beispiel das:

find ~/clang+llvm-3.3/bin/ -type f -exec echo basename {} \; 

wird nur den Basisnamen /my/found/path. Nicht das, was wir wollen, wenn wir den Dateinamen ausführen wollen.

Sie können dann aber die Ausgabe xargs. Um beispielsweise die Dateien in einem Verzeichnis zu löschen, das auf Namen in einem anderen Verzeichnis basiert, gehen Sie wie folgt vor:

cd dirIwantToRMin;
find ~/clang+llvm-3.3/bin/ -type f -exec basename {} \; | xargs rm
11
j03m

Auf einem Mac (BSD find) verwenden Sie:

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