Chcę uzyskać listę tylko nazw plików (bez reszty ścieżki) podczas wykonywania polecenia find z terminala. Jak to zrobić na komputerze Mac?
Chcę uzyskać listę tylko nazw plików (bez reszty ścieżki) podczas wykonywania polecenia find z terminala. Jak to zrobić na komputerze Mac?
Odpowiedzi:
Z basenemame:
find . -type f -exec basename {} \;
;
kończy -exec
działanie. Jest \
to potrzebne, ponieważ ;
ma również specjalne znaczenie dla powłoki.
Evilsoup wspomniał, że to, co zostało opublikowane, nie działa w przypadku nazw plików z odstępami. Zamiast tego możesz użyć:
find . -type f -print0 | while IFS= read -r -d '' filename; do echo ${filename##*/}; done
Za pomocą GNU find możesz:
find ~/tmp/ -printf "%f\n"
Prawdopodobnie warto spróbować również w systemie OS X.
-printf
nie jest obsługiwany na BSD OS X find
.
-printf
ma niewielki związek z printf
narzędziem powłoki C lub POSIX printf
. Używanie tej historycznej nazwy funkcji do czegoś innego jest bardzo źle brane pod uwagę. Konserwatywni faceci z BSD prawdopodobnie widzą to w ten sam sposób, więc prawdopodobnie nie zobaczymy klonu -printf
w znalezisku BSD pod tą nazwą.
Jest lepszy sposób na usunięcie wszystkiego oprócz ostatniej części ścieżki pliku; z awk. Jest lepiej, ponieważ awk nie jest uruchamiany raz dla każdego pliku. W niektórych przypadkach ma to znaczenie.
find ~/tmp/ -type f | awk -F/ '{ print $NF }'
Szukamy tylko plików w ~ / tmp i otrzymujemy listę, w której każdy wpis jest oddzielony ukośnikami. Dlatego używamy ukośnika jako separatora pól (-F /) i wypisujemy parametr pola (1 $ .. 9 $), który odpowiada ostatniemu polu ($ NF).
EDYCJA :
Używanie sed
:
$ find . -type f | sed 's/.*\///'
Korzystanie z polecenia xargs , jak wspomniano w odpowiedzi @nerdwaller
$ find . -type f -print0 | xargs --null -n1 basename
find . -type f -print0| xargs --null -n1 basename
--null
ani nie -n1
jest dostępna w OSX
A co z tym:
find … | egrep -o -e '[^/]+$'
Zaleta: spawnowany jest tylko jeden dodatkowy proces, a nie jeden dla każdego wyniku.