Wie entferne ich das führende "./" in Unix "find"?

139
find . -type f -print

druckt aus

./file1
./file2
./file3

Jede Möglichkeit, es drucken zu lassen

file1
file2
file3

?

Breadjesus
quelle
1
Wenn Sie -exec /path/to/myscript.sh {} in Ihrem verwendet find, -printf '%P\n'funktioniert das nicht. Stattdessen muss ich das ./Präfix Chomping innerhalb des Skripts machen durch:p=${1#"./"}
truthadjustr
Wenn Sie es nur für eine einzelne Datei tun:f=`find . -name migration`; echo ${f/.\//}
masterxilo

Antworten:

39

Wenn sie nur im aktuellen Verzeichnis sind

find * -type f -print

Ist es das was du willst?

Tim Green
quelle
21
Dadurch werden Dateien mit Namen übersehen, die mit einem Punkt beginnen.
Sean
2
Schlecht, abhängig von den Shell-Einstellungen * wird möglicherweise nicht als "versteckte" Dateien / Verzeichnisse ausgewertet - solche, die mit dot (.) Beginnen Versuchen Sie, diesen Befehl in Ihrem Home-Verzeichnis auszuführen, und suchen Sie dann einfach "-typ f" und sehen Sie den Unterschied .
Ilia K.
35
Ein relevanteres Problem ist, dass '*' von der Shell ausgewertet wird. Sie haben effektiv eine Art böswilliger Code-Injektionssituation. Es wäre trivial, eine Datei mit dem Namen '--exec rm' und eine andere mit dem Namen 'zzzz;' zu erstellen. Auf Wiedersehen Dateien.
CWF
6
Das ist unsicher. Wenn ein Dateiname mit einem Bindestrich beginnt, wird er als Option zum Auffinden behandelt und kann fehlschlagen oder möglicherweise Schaden anrichten.
Dale Anderson
4
Warum ist -printerforderlich? Es gab das gleiche Ergebnis ohne diese Flagge.
user13107
238

Suchen Sie im aktuellen Verzeichnis nur reguläre Dateien und drucken Sie sie ohne " ./" Präfix:

find -type f -printf '%P\n'

Vom Menschen finden, Beschreibung des -printfFormats:

% P Dateiname mit dem Namen des Befehlszeilenarguments, unter dem es gefunden wurde, entfernt.

Ilia K.
quelle
18
+1 Gute Lösung, wenn Ihre Version findunterstützt -printf(nicht alle).
Todd Owen
2
Wie Todd sagte, aber genauer: Es ist nicht POSIX 7.
Ciro Santilli 法轮功 冠状 病 六四 事件 法轮功
8
Unterstützt oder nicht, es ist definitiv sicherer als die akzeptierte Antwort.
Dale Anderson
10
Sie können \0anstelle von verwenden, \nwenn Sie es xargs -0find -type f -printf '%P\0' | xargs -0 head
weiterleiten
1
@ Quanlong, es funktioniert unter MacOS, wenn Sie brew install findutils;)
Blockloop
58

Verwenden Sie sed

find . | sed "s|^\./||"
Lie Ryan
quelle
2
Dies ist meine bevorzugte Lösung; Es ist POSIX-kompatibel (funktioniert praktisch überall, auch bei eingebetteten Systemen), sehr kurz und führt wahrscheinlich nicht zu unerwartetem Verhalten. Dies sollte die akzeptierte Antwort sein.
Jody Bruchon
6
Wie würde das kombiniert werden find -exec?
Paul Wintz
find -exec sh -c "echo {} | sed 's|^\./||'" \; oder find -exec sh -c "sed 's|^\./||' <<< '{}'" \;
Xenithorb
12

es kann kürzer sein

find * -type f
Ghostdog74
quelle
Besser 2> /dev/null, Fehler zu ignorieren, die gemeldet werden, wenn der Befehl in einem leeren Verzeichnis ausgeführt wird.
neevek
2

Eine andere Möglichkeit, die ./

find * -type d -maxdepth 0
Valheru
quelle
Während dieser Code die Frage lösen kann, einschließlich einer Erklärung, wie und warum dies das Problem löst, würde dies wirklich dazu beitragen, die Qualität Ihres Beitrags zu verbessern, und wahrscheinlich zu mehr Up-Votes führen. Denken Sie daran, dass Sie in Zukunft die Frage für die Leser beantworten, nicht nur für die Person, die jetzt fragt. Bitte bearbeiten Sie Ihre Antwort, um Erklärungen hinzuzufügen und anzugeben, welche Einschränkungen und Annahmen gelten.
David Buck
2

Da die -printfOption unter OSX nicht verfügbar findist, ist hier ein Befehl, der unter OSX find funktioniert, nur für den Fall, dass jemand nicht gnu findmit brewetc installieren möchte :

find . -type f -execdir printf '%s\n' {} + 
Anubhava
quelle
1
Leider wird dadurch der gesamte Pfad jeder gefundenen Datei, einschließlich der Zwischenunterverzeichnisse, entfernt und nur der Dateiname selbst gedruckt.
PLL
1
Du hast recht. Diese Lösung eignet sich nur für Dateien im aktuellen Verzeichnis. Für verschachtelte Dateien müssen wir verwenden:find . -type f -exec bash -c 'for f; do echo "${f#./}"; done' {} +
anubhava
1

Eine andere Möglichkeit, das zu entfernen, ./ist die Verwendung von cutlike:

find -type f | cut -c3-

Weitere Erklärungen finden Sie hier

banjoAtix
quelle