find . -type d
можна використовувати для пошуку всіх каталогів нижче деякої початкової точки. Але він також повертає поточний каталог ( .), який може бути небажаним. Як це можна виключити?
find . -type d
можна використовувати для пошуку всіх каталогів нижче деякої початкової точки. Але він також повертає поточний каталог ( .), який може бути небажаним. Як це можна виключити?
Відповіді:
find . ! -path . -type d
У цьому конкретному випадку ( .), гольфи краще, ніж mindepthрішення (24 проти 26 символів), хоча це, ймовірно, трохи складніше через! .
Щоб виключити інші каталоги, це полегшиться для гольфу та вимагає змінної для DRYness:
D="long_name"
find "$D" ! -path "$D" -type d
Моє дерево рішень між !та -mindepth:
!для мобільності..? Киньте монету.long_name? Використовуйте -mindepth.find / ! -regex '/\(a\|b\)/.*'або простіше, прокладати через grep. Щоб не рекурсию, вище було б вкрай неефективно , і ви повинні використовувати -prune: stackoverflow.com/questions/1489277 / ...
findз , grepщоб виключити каталог , але батьківський каталог був ще там, в результаті чого всі будуть видалені в будь-якому випадку.
find, вам потрібно буде перевірити префікси: stackoverflow.com/questions/17959317/… Але Bash for цикл може це впоратися :-)
\!), щоб бути на безпечній стороні. Усі приклади в моїй машині man findуникнули, тому здається, що це, мабуть, хороша ідея ™. Редагувати - Щойно помітив, це навіть прямо сказано:! expr True if expr is false. This character will also usually need protection from interpretation by the shell.
Параметр findможе регулюватися не тільки глибиною рекурсії -maxdepth, але також можна обмежувати глибину «зверху», використовуючи відповідний -mindepthпараметр. Отже, що насправді потрібно:
find . -mindepth 1 -type d
find . -mindepth 1 -maxdepth 1 -type d ...
Я використовую, 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
-execопцією. Наприклад, якщо ви спробуєте find dir/* -type d -exec rmdir {} \;, ви побачите помилки.
rmdirі, швидше за все, говорять вам, що каталоги не порожні, оскільки findзробить глибокий пошук у каталогах, показуючи батькам перед їхніми дітьми.
Ну, просте вирішення також (рішення не працювало для мене на Windows git bash)
find * -type d
Це може бути не дуже ефективно, але ця робота виконується, і це те, що нам іноді потрібно.
[Редагувати]: Як прокоментував @AlexanderMills, він не відображатиметься прихованих каталогів у кореневому розташуванні (наприклад ./.hidden), але відображатиме приховані підкаталоги (напр. ./folder/.hiddenSub). [Випробувано на git bash на windows]
find /path/ ! -path "/path/first" ! -path "/path/second"це єдиний спосіб?