Chciałbym użyć, find
aby wyświetlić listę wszystkich plików i katalogów rekurencyjnie w danym katalogu głównym dla cpio
operacji. Nie chcę jednak, aby sam katalog główny pojawiał się na ścieżkach. Na przykład obecnie otrzymuję:
$ find diskimg
diskimg
diskimg/file1
diskimg/dir1
diskimg/dir1/file2
Ale chciałbym dostać
file1
dir1
dir1/file2
(zwróć uwagę, że root nie znajduje się również w moich pożądanych wynikach, ale łatwo się go pozbyć tail
).
Korzystam z systemu OS X i wolałbym nie instalować żadnych dodatkowych narzędzi (np. GNU find), jeśli to możliwe, ponieważ chciałbym udostępnić skrypt, który piszę innym użytkownikom systemu OS X.
Wiem, że można to zrobić, cut
aby odciąć katalog główny, ale wydaje się to nieoptymalne rozwiązanie. Czy jest dostępne lepsze rozwiązanie?
find diskimg/* | cut -d '/' -f2-
Odpowiedzi:
Jeśli to, co próbujesz zrobić, nie jest zbyt skomplikowane, możesz to zrobić za pomocą sed:
Lub
cut
:źródło
find diskimg | grep -v '^diskimg$' | sed -e 's|^diskimg/||'
(zauważ, że dodałem również „-e” i^
równie dobrą praktykę (tutaj nie jest to konieczne, ponieważ jesteś pewien, że każda linia będzie miała to ... ale nadal dobrą praktykę , i oszczędza trochę procesora;))find diskimg | sed -e 's|^diskimg/*||'
(„/ *” będzie pasować do dowolnej liczby „/”, nawet 0)cut
polecenie jest czystsze niż to, którego użyłem; Lubię to. (sed
Rozwiązanie jest również miłe, ale powtórzeniediskimg/
jest trochę niefortunne).cd
najpierw do katalogu:Po zakończeniu wrócisz do katalogu głównego.
W tym przypadku twoje pliki zostaną uzupełnione ./; jedynym sposobem, w jaki widzę, byłoby użycie
cut
:Użyj podpowłoki, aby uniknąć zmiany bieżącego katalogu powłoki (nie jest to konieczne, jeśli wysyłasz dane wyjściowe, ponieważ lewa strona potoku działa już w podpowłoce).
źródło
(cd diskimg && find . ; )
. W ten sposóbcd diskimg && find .
odbywa się to w podpowłoce: po wyjściu z tej podpowrotki powracasz do swojej własnej powłoki, niezależnie od tego, gdzie byłeś.find *
jest innym sposobem na obejście bezużytecznego prefiksuKolejna, bardziej złożona, ale wykorzystująca podejście find z mojej innej odpowiedzi:
źródło
find
wsparciaprintf
.find
Obsługuje tylko GNU-printf
, podczas gdy wiele BSDfind
skopiowało niektóre funkcje GNUfind
, żadne jeszcze nie skopiowało-printf
(AFAIK).%P
na ścieżkę względną co było mi potrzebne.Użyj
realpath
narzędzia:źródło
--relative-to
.