9

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

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

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

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

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

4 ответа4

14

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

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

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

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

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-of-x -path '*/inc/*' -type d > list
1

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

find X/ -type d | grep "/inc/" > list

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .