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


8

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

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

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

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

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

Ответы:


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.


вариант этого ответа был полезен для меня, когда я хотел только подкаталоги глубины 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

Хорошо, это тоже сработает! Однако, в оболочках Unix / Linux, там на самом деле нет такой вещи , как в ответ. Это смесь личных предпочтений и того, что легко понять.
Вишал Кочерлакота

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.