Как исключить эту/текущую/точную папку из поиска "тип d"

find . -type d

может использоваться для поиска всех каталогов ниже некоторой начальной точки. Но он также возвращает текущий каталог (.), что может быть нежелательным. Как его можно исключить?

Ответ 1

Решение POSIX 7:

find . ! -path . -type d

В этом конкретном случае (.) гольф лучше, чем решение mindepth (24 против 26 символов), хотя это, вероятно, немного сложнее напечатать из-за !.

Чтобы исключить другие каталоги, это будет лучше для гольфа и потребует переменную для СУХОЙ:

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

Мое дерево решений между ! и -mindepth:

  • script? Используйте ! для переносимости.
  • интерактивная сессия по GNU?
    • исключить .? Бросьте монету.
    • исключить long_name? Используйте -mindepth.

Ответ 2

Не только глубина рекурсии find может управляться параметром -maxdepth, глубина также может быть ограничена "сверху" с использованием соответствующего параметра -mindepth. Итак, что действительно нужно:

find . -mindepth 1 -type d

Ответ 3

Я использую find ./* <...>, когда я не возражаю игнорировать доп файлы первого уровня (*glob не соответствует этим по умолчанию в bash - см. параметр "dotglob" в встроенном магазине: https://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html).

eclipse tmp # find .
.
./screen
./screen/.testfile2
./.X11-unix
./.ICE-unix
./tmux-0
./tmux-0/default
eclipse tmp # find ./*
./screen
./screen/.testfile2
./tmux-0
./tmux-0/default

Ответ 4

Ну, простой обходной путь (решение не работает для меня на git bash)

find * -type d

Возможно, он не очень эффективен, но выполняет свою работу, и это то, что нам иногда нужно.

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