Пошук підкаталогів у всіх каталогах з однаковою назвою


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' d>
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.