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
Antworten
Zu viele Anzeigen?
spectrum
Punkte
319
Freeman
Punkte
3434
minusf
Punkte
942
-exec
y -execdir
sind langsam, xargs
ist König.
$ alias f='time find /Applications -name "*.app" -type d -maxdepth 5'; \
f -exec basename {} \; | wc -l; \
f -execdir echo {} \; | wc -l; \
f -print0 | xargs -0 -n1 basename | wc -l; \
f -print0 | xargs -0 -n1 -P 8 basename | wc -l; \
f -print0 | xargs -0 basename | wc -l
139
0m01.17s real 0m00.20s user 0m00.93s system
139
0m01.16s real 0m00.20s user 0m00.92s system
139
0m01.05s real 0m00.17s user 0m00.85s system
139
0m00.93s real 0m00.17s user 0m00.85s system
139
0m00.88s real 0m00.12s user 0m00.75s system
xargs
hilft auch die Parallelität.
Komischerweise kann ich mir den letzten Fall von xargs
ohne -n1
. Es liefert das richtige Ergebnis und ist das schnellste ¯\_()_/¯
( basename
benötigt nur 1 Pfadargument, aber xargs
wird sie alle (eigentlich 5000) senden, ohne -n1
. funktioniert nicht unter Linux und openbsd, nur unter macOS...)
Einige größere Zahlen von einem Linux-System, um zu sehen, wie -execdir
hilft, ist aber immer noch viel langsamer als eine parallele xargs
:
$ alias f='time find /usr/ -maxdepth 5 -type d'
$ f -exec basename {} \; | wc -l; \
f -execdir echo {} \; | wc -l; \
f -print0 | xargs -0 -n1 basename | wc -l; \
f -print0 | xargs -0 -n1 -P 8 basename | wc -l
2358
3.63s real 0.10s user 0.41s system
2358
1.53s real 0.05s user 0.31s system
2358
1.30s real 0.03s user 0.21s system
2358
0.41s real 0.03s user 0.25s system
jazzinka
Punkte
11
- See previous answers
- Weitere Antworten anzeigen