Znajdowanie podkatalogów we wszystkich katalogach o tej samej nazwie

8

Chcę uruchomić polecenie, aby:

  1. Znajdź wszystkie katalogi o nazwie „ inc” w folderze „ X”.
  2. Wyświetl wszystkie podkatalogi pod każdym „ X/.../inc/”.
  3. 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ć?

iammilind
źródło

Odpowiedzi:

13

find może zrobić to wszystko samo:

find X -path '*/inc/*' -type d > list

Przeczytaj -pathczęść, man findaby uzyskać więcej informacji.

Jak szybko wspomniałem w komentarzu: jeśli przechowujesz linię katalogów oddzieloną w pliku tekstowym, nazwy katalogów zawierające znaki nowej linii nie będą jednoznacznie reprezentowane. Jeśli masz pewność, że katalogi nie zawierają nowych wierszy, nie ma problemu. Tylko ogólna uwaga.

Daniel Andersson
źródło
tak. udzieliłem tej samej odpowiedzi tutaj
książę John Wesley
Lub znajdź X-name 'inc' -type d> list
MaQleod
@MaQleod: Nie, to nie jest pytanie.
Daniel Andersson
4

Oto przydatny jednowarstwowy:

find X -type d -name "inc" -exec sh -c 'find {} -type d' \; > list

Działa findna każdym z pierwszych findwyników. execOpcja może mieć również minimalny polecenie powłoki, w której - jak powiedziałem - {}jest zastępowany każdego katalogu z pierwszych find.

Drugi find, na twoje żądanie, „wyświetli listę wszystkich podkatalogów” pierwszych wyników, w tym inckatalog. Jeśli nie chcesz tego samego w danych wyjściowych, pozwól drugiemu find przynajmniej folderom wyjściowym o głębokości 1.

find X -type d -name "inc" -exec sh -c 'find {} -mindepth 1 -type d' \; > list

Następnie przekierujemy polecenie stdoutdo list.

slhck
źródło
odmiana tej odpowiedzi była dla mnie pomocna, gdy chciałem tylko głębokości 1 podkatalogów oryginalnego dopasowania find path -name inc -type d -exec sh -c 'find {} -mindepth 1 -maxdepth 1 -type d' \;
Core
1

W porządku znalazłem odpowiedź, aby zasymulować to zagnieżdżone znalezisko:

find X/ -type d | grep "/inc/" > list
iammilind
źródło
Fajnie, to też zadziała! Jednak w muszli Unix / Linux, tam naprawdę nie ma czegoś takiego, jak na odpowiedź. Jest to mieszanka osobistych preferencji i tego, co jest łatwe do naśladowania.
Vishal Kotcherlakota
Aby zająć się niekonwencjonalnymi (ale istniejącymi) nazwami plików, np. Znakami nowej linii: find X/ -type d -print0 | awk 'BEGIN{RS="\0"}/\/inc\//' > list( grep -zró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 echoAby 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ą.
Daniel Andersson
1

Spróbuj tego:

   find path-of-x -path '*/inc/*' -type d > list
Książę John Wesley
źródło
nie mam teraz komputera z linuksem, żeby go teraz przetestować ...
Prince John Wesley,
To nie działa Ale dzięki za sugestie "\inc\":)
iammilind
@iammilind: spróbuj z -pathflagą
Prince John Wesley