Chcę uruchomić polecenie, aby:
- Znajdź wszystkie katalogi o nazwie „
inc
” w folderze „X
”. - Wyświetl wszystkie podkatalogi pod każdym „
X/.../inc/
”. - Przekieruj dane wyjściowe do pliku o nazwie „
list
”
Próbowałem różnych kombinacji poniższego polecenia, ale bez powodzenia:
$ find X/ -name "inc" -print | xargs find {} -type d > list
find: path must precede expression
W jaki sposób mogę to zrobić?
linux
command-line
find
iammilind
źródło
źródło
Oto przydatny jednowarstwowy:
Działa
find
na każdym z pierwszychfind
wyników.exec
Opcja może mieć również minimalny polecenie powłoki, w której - jak powiedziałem -{}
jest zastępowany każdego katalogu z pierwszychfind
.Drugi
find
, na twoje żądanie, „wyświetli listę wszystkich podkatalogów” pierwszych wyników, w tyminc
katalog. Jeśli nie chcesz tego samego w danych wyjściowych, pozwól drugiemufind
przynajmniej folderom wyjściowym o głębokości 1.Następnie przekierujemy polecenie
stdout
dolist
.źródło
find path -name inc -type d -exec sh -c 'find {} -mindepth 1 -maxdepth 1 -type d' \;
W porządku znalazłem odpowiedź, aby zasymulować to zagnieżdżone znalezisko:
źródło
find X/ -type d -print0 | awk 'BEGIN{RS="\0"}/\/inc\//' > list
(grep -z
również ogranicza znak null, ale wydaje się, że jego dane wyjściowe również są null oddzielone, więc trzeba by go przepuścić np.xargs -0L1 echo
Aby uzyskać wiersz po wierszu ). W takim przypadku, ponieważ zapisujesz listę do pliku z każdym wpisem oddzielonym znakiem nowej linii, znaki nowej linii w nazwach plików będą nadal niejednoznacznie reprezentowane. Być może nie potrzebujesz nawet pliku pośredniego, w zależności od tego, co chcesz zrobić z listą.Spróbuj tego:
źródło
"\inc\"
:)-path
flagą