Як виключити цю / поточну / крапкову папку з пошуку "типу d"


186
find . -type d

можна використовувати для пошуку всіх каталогів нижче деякої початкової точки. Але він також повертає поточний каталог ( .), який може бути небажаним. Як це можна виключити?

Відповіді:


194

Рішення POSIX 7 :

find . ! -path . -type d

У цьому конкретному випадку ( .), гольфи краще, ніж mindepthрішення (24 проти 26 символів), хоча це, ймовірно, трохи складніше через! .

Щоб виключити інші каталоги, це полегшиться для гольфу та вимагає змінної для DRYness:

D="long_name"
find "$D" ! -path "$D" -type d

Моє дерево рішень між !та -mindepth:

  • сценарій? Використовувати !для мобільності.
  • інтерактивна сесія в GNU?
    • виключити .? Киньте монету.
    • виключити long_name? Використовуйте -mindepth.

якщо вам потрібно виключити кілька шляхів, просто зробіть find /path/ ! -path "/path/first" ! -path "/path/second"це єдиний спосіб?
Вінсент Де Смет

2
@VincentDeSmet Ви хочете виключити лише ці шляхи чи насправді не повторити їх? Якщо тільки доріжки, ви можете використовувати find / ! -regex '/\(a\|b\)/.*'або простіше, прокладати через grep. Щоб не рекурсию, вище було б вкрай неефективно , і ви повинні використовувати -prune: stackoverflow.com/questions/1489277 / ...
Чіро Сантіллі郝海东冠状病六四事件法轮功

моя проблема полягала в наступному: я хотів рекурсивно видалити все в каталозі, крім 1 підкаталогу. Я використовую findз , grepщоб виключити каталог , але батьківський каталог був ще там, в результаті чого всі будуть видалені в будь-якому випадку.
Вінсент Де Смет

@VincentDeSmet Я не бачу прямого рішення find, вам потрібно буде перевірити префікси: stackoverflow.com/questions/17959317/… Але Bash for цикл може це впоратися :-)
Ciro Santilli 郝海东 冠状 病 六四 事件法轮功

Ви, мабуть, хочете уникнути знаку оклику ( \!), щоб бути на безпечній стороні. Усі приклади в моїй машині man findуникнули, тому здається, що це, мабуть, хороша ідея ™. Редагувати - Щойно помітив, це навіть прямо сказано:! expr True if expr is false. This character will also usually need protection from interpretation by the shell.
Адріан Гюнтер

201

Параметр findможе регулюватися не тільки глибиною рекурсії -maxdepth, але також можна обмежувати глибину «зверху», використовуючи відповідний -mindepthпараметр. Отже, що насправді потрібно:

find . -mindepth 1 -type d

5
працює на пошуку GNU, але, на жаль, є розширенням на gnu до POSIX 7 , і навіть LSB використовує утиліти оболонки POSIX (не розширені GNU)
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

6
Це працювало для мене. А саме:find . -mindepth 1 -maxdepth 1 -type d ...
racl101

19

Я використовую, find ./* <...>коли я не проти ігнорувати dotfiles першого рівня ( *глобус не відповідає цим за замовчуванням у bash - дивіться опцію 'dotglob' у магазині вбудованого: https://www.gnu.org/software/bash /manual/html_node/The-Shopt-Builtin.html ).

затемнення tmp # знайти.
.
./екран
./screen/.testfile2
./.X11-unix
./.ICE-unix
./tmux-0
./tmux-0/default
eclipse tmp # find ./*
./екран
./screen/.testfile2
./tmux-0
./tmux-0/default

FYI. не використовуйте цей трюк з -execопцією. Наприклад, якщо ви спробуєте find dir/* -type d -exec rmdir {} \;, ви побачите помилки.
plhn

Ви помиляєтесь чи, можливо, неправильно оцінили. Ця команда буде добре працювати. Якщо ви бачите помилки, вони надходитимуть від них rmdirі, швидше за все, говорять вам, що каталоги не порожні, оскільки findзробить глибокий пошук у каталогах, показуючи батькам перед їхніми дітьми.
Мілош Іванович

2
Примітка: "ігнорування точок файлів першого рівня" також означає виключення всіх прихованих файлів / каталогів.
Джонатан Н

2

Ну, просте вирішення також (рішення не працювало для мене на Windows git bash)

find * -type d

Це може бути не дуже ефективно, але ця робота виконується, і це те, що нам іноді потрібно.

[Редагувати]: Як прокоментував @AlexanderMills, він не відображатиметься прихованих каталогів у кореневому розташуванні (наприклад ./.hidden), але відображатиме приховані підкаталоги (напр. ./folder/.hiddenSub). [Випробувано на git bash на windows]

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.