Поиск подкаталогов во всех каталогах с одинаковыми именами

8

Я хочу запустить команду для:

  1. Найти все каталоги с именем " inc" в папке " X".
  2. Список всех подкаталогов под каждым " X/.../inc/".
  3. Перенаправить вывод в файл с именем " list"

Я пробовал различные комбинации приведенной ниже команды, но безуспешно:

$ find X/ -name "inc" -print | xargs find {} -type d > list
find: path must precede expression

Как я могу это сделать?

iammilind
источник

Ответы:

13

find может сделать все это самостоятельно:

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

Прочитайте -pathчасть man findдля получения дополнительной информации.

Как я быстро упомянул в комментарии: если вы храните строку каталогов, разделенную в текстовом файле, имена каталогов, содержащие символы новой строки, не будут однозначно представлены. Если вы уверены, что каталоги не содержат новых строк, это нормально. Просто общее замечание.

Даниэль Андерссон
источник
да. я дал тот же ответ здесь
принц Джон Уэсли
Или найдите X -name 'inc' -type d> list
MaQleod
@MaQleod: Нет, это не вопрос.
Даниэль Андерссон
4

Вот удобная строчка:

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

Он работает findна каждом из первых findрезультатов. execВариант может также взять минимальную команду оболочки, в которой - как я уже сказал - {}заменяется каждой директории из первых find.

Второй find, по вашему запросу, «перечислит все подкаталоги» первых результатов, включая incкаталог. Если вы сами этого не хотите выводить, позвольте вторым find хотя бы вывести папки глубиной 1.

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

Затем мы просто перенаправим команду stdoutв list.

slhck
источник
вариант этого ответа был полезен для меня, когда я хотел только подкаталоги глубины 1 оригинального соответствия find path -name inc -type d -exec sh -c 'find {} -mindepth 1 -maxdepth 1 -type d' \;
Core
1

Хорошо, я нашел ответ, чтобы смоделировать эту вложенную находку:

find X/ -type d | grep "/inc/" > list
iammilind
источник
Хорошо, это тоже сработает! Однако, в оболочках Unix / Linux, там на самом деле нет такой вещи , как в ответ. Это смесь личных предпочтений и того, что легко понять.
Вишал Кочерлакота
Чтобы позаботиться о нетрадиционных (но уже существующих) именах файлов, например, с помощью новой строки: find X/ -type d -print0 | awk 'BEGIN{RS="\0"}/\/inc\//' > list( grep -zтакже разделяет нулевой символ, но его выходные данные, похоже, также разделены нулями, так что тогда нужно будет передать его, например, xargs -0L1 echoчтобы получить его построчно ). В этом случае, поскольку вы сохраняете список в файл с каждой записью, разделенной новой строкой, новые строки в именах файлов по- прежнему будут представлены неоднозначно. Возможно, вам даже не нужен промежуточный файл, в зависимости от того, что вы хотите сделать со списком.
Даниэль Андерссон
1

Попробуй это:

   find path-of-x -path '*/inc/*' -type d > list
Принц Джон Уэсли
источник
У меня нет машины Linux, чтобы проверить это сейчас ...
Принц Джон Уэсли
Это не работает Но спасибо, что предложили мне "\inc\":)
iammilind
@iammilind: попробуйте с -pathфлагом
принц Джон Уэсли