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ć?

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.


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.


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

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.