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"
це єдиний спосіб?