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 /path/ ! -path "/path/first" ! -path "/path/second"
это только так?find / ! -regex '/\(a\|b\)/.*'
или, проще говоря, труба через grep. Чтобы не повторяться, вышеупомянутое было бы очень неэффективно, и вы должны использовать-prune
: stackoverflow.com/questions/1489277/…find
с,grep
чтобы исключить каталог, но родительский каталог все еще был там, в результате чего все равно было удалено.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.
Параметром
find
можно управлять не только глубиной рекурсии, но и глубиной-maxdepth
«сверху», используя соответствующий-mindepth
параметр. Так что на самом деле нужно:источник
find . -mindepth 1 -maxdepth 1 -type d ...
Я использую,
find ./* <...>
когда не возражаю игнорировать точечные файлы первого уровня (глобус*
не соответствует этим по умолчанию в bash - см. Опцию 'dotglob' в встроенной программе shopt: https://www.gnu.org/software/bash /manual/html_node/The-Shopt-Builtin.html ).источник
-exec
опцией. Например, если вы попытаетесьfind dir/* -type d -exec rmdir {} \;
, вы увидите ошибки.rmdir
и, скорее всего, сообщают вам, что каталоги не пусты, посколькуfind
будут выполнять поиск в каталогах в глубину, показывая родителей перед их детьми.Ну, простой обходной путь (решение не работало для меня на windows git bash)
find * -type d
Возможно, он не очень эффективен, но выполняет свою работу, и это то, что нам иногда нужно.
[Редактировать]: Как прокомментировал @AlexanderMills, он не будет отображать скрытые каталоги в корневом расположении (например
./.hidden
), но будет отображать скрытые подкаталоги (например,./folder/.hiddenSub
). [Протестировано с git bash на windows]источник