Как исключить эту папку / current / dot из поиска «type 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/…
Ciro Santilli 28 冠状 病 六四 事件 法轮功
моя проблема заключалась в следующем: я хотел рекурсивно удалить все в каталоге, кроме 1 подкаталога. Я использовал findс, grepчтобы исключить каталог, но родительский каталог все еще был там, в результате чего все равно было удалено.
Винсент Де Смет
@ VincentDeSmet Я не вижу прямого решения find, вам нужно проверить префиксы: stackoverflow.com/questions/17959317/… Но цикл Bash for может с этим справиться :-)
Сиро Сантилли 郝海东 冠状 病 六四 事件法轮功
Вы, вероятно, хотите избежать восклицательного знака ( \!), чтобы быть на безопасной стороне. Во всех примерах на моей машине man findэто сбежало, поэтому кажется, что это, вероятно, Good Idea ™. Редактировать - Просто заметил, что это даже явно говорит:! 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 find, но, к сожалению, является расширением gnu для поиска POSIX 7 , и даже LSB использует утилиты оболочки POSIX (не расширенные GNU)
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
6
Это сработало для меня. А именно:find . -mindepth 1 -maxdepth 1 -type d ...
racl101
19

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

затмение TMP # найти.
,
./screen
./screen/.testfile2
./.X11-unix
./.ICE-unix
./tmux-0
./tmux-0/default
eclipse tmp # find ./*
./screen
./screen/.testfile2
./tmux-0
./tmux-0/default
Милош Иванович
источник
FYI. не используйте этот трюк с -execопцией. Например, если вы попытаетесь find dir/* -type d -exec rmdir {} \;, вы увидите ошибки.
PLN
Вы ошибаетесь или, возможно, ошибаетесь. Эта команда будет работать нормально. Если вы видите ошибки, они будут приходить rmdirи, скорее всего, сообщают вам, что каталоги не пусты, поскольку findбудут выполнять поиск в каталогах в глубину, показывая родителей перед их детьми.
Милош Иванович
2
Примечание: «игнорирование файлов точек первого уровня» также означает исключение всех скрытых файлов / каталогов.
Джонатан Х
2

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

find * -type d

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

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

StackHola
источник