So erhalten Sie nur Namen vom Befehl find ohne Pfad

14

Ich versuche, mit find nur die Namen aus dem Suchergebnis abzurufen, aber es enthält immer auch die Verzeichnisse. Wie kann ich mit find nur die Namen drucken (oder einer Variablen zuweisen)?

find trunk/messages/ -name "*.po" -printf '%f\n'

Ein ähnlicher Befehl, um dies einer Variablen zuzuweisen, z. B. "Ressource", um sie später zu verwenden.

EDIT: Und wenn möglich nur der Name ohne die Erweiterung.

aufwachen
quelle

Antworten:

20

Benutzen find trunk/messages/ -name "*.po" -exec basename {} .po \;

Beispiel und Erklärungen:

Erstellen Sie einige Testdateien:

$ touch test1.po  
$ touch test2.po  
$ find . -name "*.po" -print
./test1.po  
./test2.po

Ok, Dateien werden gefunden, einschließlich Pfad.

basenameFühren Sie für jedes Ergebnis den .po-Teil des Namens aus und entfernen Sie ihn

$ find . -name "*.po" -exec basename \{} .po \;  
test1  
test2
Hennes
quelle
Vielen Dank :). Kann ich nur die PO-Erweiterung von dirs entfernen? Ich meine: dir1 / po1.po und dir2 / po2.po können sie wie dir1 / po1 und dir2 / po2 bekommen werden?
Weck
@ user1754665find . -name '*.po' -exec bash -c 'echo ${0%.po}' {} \;
slhck
@slhck danke. Zuletzt muss ich den Dateinamen ohne Erweiterung abrufen und den letzten Ordner, in dem er sich befindet: zB: dir1 / subdir1 / subsubdir1 / po1.po und dir2 / subdir2 / subsubdir2 / po2.po sollte auf eine Variable wie: subsubdir1 / po1 gesetzt werden subsubdir2 / po2.
Aufwachen
@ user1754665 Hmm, vielleichtfind . -name '*.po' -type f -exec sh -c 'echo $(basename $(dirname $0))/$(basename $0)' {} \;
slhck
@Hennes Was ist der Zweck von Backslash vor der öffnenden geschweiften Klammer in der letzten find?
Utku
3

Sie können -execdirParameter verwenden, die die Datei ohne Pfad drucken, z.

find . -name "*.po" -execdir echo {} ';'

Dateien ohne Erweiterungen:

find . -name "*.txt" -execdir basename {} .po ';'

Hinweis: Da es sich nicht um POSIX handelt, finddruckt BSD saubere Dateinamen, bei Verwendung von GNU findwird jedoch zusätzlich gedruckt ./.

Siehe: Warum verhält sich der Befehl GNU find -execdir anders als der Befehl BSD find?

Kenorb
quelle