374 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

505voto

SiegeX Punkte 127640

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

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

219voto

Kambus Punkte 3246

Wenn Ihr find keine Option -printf hat, können Sie auch basename verwenden:

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

41voto

kenorb Punkte 134883

Verwenden Sie -execdir die automatisch die aktuelle Datei in {} zum Beispiel:

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

Sie können auch Folgendes verwenden $PWD anstelle von . (auf manchen Systemen wird kein zusätzlicher Punkt vorne angezeigt).

Wenn Sie noch einen zusätzlichen Punkt haben, können Sie alternativ auch laufen:

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

-execdir utility [argument ...] ;

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

Bei Verwendung + anstelle von ; entonces {} wird bei jedem Aufruf von utility durch so viele Pfadnamen wie möglich ersetzt. Mit anderen Worten, es gibt alle Dateinamen in einer Zeile aus.

38voto

kurumi Punkte 24377

Wenn Sie GNU find verwenden

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 einen Bash haben (mindestens 4) Lösung

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

14voto

j03m Punkte 4913

Wenn Sie eine Aktion nur gegen den Dateinamen ausführen wollen, verwenden Sie basename kann schwierig sein.

Zum Beispiel dies:

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

gibt nur ein Echo von basename aus /my/found/path . Nicht das, was wir wollen, wenn wir den Dateinamen ausführen wollen.

Aber Sie können dann xargs die Ausgabe. z.B. um die Dateien in einem Verzeichnis anhand der Namen in einem anderen Verzeichnis zu löschen:

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

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