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/.\//}
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.
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|^\./||' <<< '{}'" \;
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 :
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:
-exec /path/to/myscript.sh {}
in Ihrem verwendetfind
,-printf '%P\n'
funktioniert das nicht. Stattdessen muss ich das./
Präfix Chomping innerhalb des Skripts machen durch:p=${1#"./"}
f=`find . -name migration`; echo ${f/.\//}
Antworten:
Wenn sie nur im aktuellen Verzeichnis sind
find * -type f -print
Ist es das was du willst?
quelle
-print
erforderlich? Es gab das gleiche Ergebnis ohne diese Flagge.Suchen Sie im aktuellen Verzeichnis nur reguläre Dateien und drucken Sie sie ohne "
./
" Präfix:Vom Menschen finden, Beschreibung des
-printf
Formats:quelle
find
unterstützt-printf
(nicht alle).\0
anstelle von verwenden,\n
wenn Sie esxargs -0
find -type f -printf '%P\0' | xargs -0 head
brew install findutils
;)Verwenden Sie sed
quelle
find -exec
?find -exec sh -c "echo {} | sed 's|^\./||'" \;
oderfind -exec sh -c "sed 's|^\./||' <<< '{}'" \;
es kann kürzer sein
quelle
2> /dev/null
, Fehler zu ignorieren, die gemeldet werden, wenn der Befehl in einem leeren Verzeichnis ausgeführt wird.Eine andere Möglichkeit, die ./
quelle
Da die
-printf
Option unter OSX nicht verfügbarfind
ist, ist hier ein Befehl, der unter OSX find funktioniert, nur für den Fall, dass jemand nichtgnu find
mitbrew
etc installieren möchte :quelle
find . -type f -exec bash -c 'for f; do echo "${f#./}"; done' {} +
Eine andere Möglichkeit, das zu entfernen,
./
ist die Verwendung voncut
like:Weitere Erklärungen finden Sie hier
quelle