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
это сбежало, поэтому кажется, что это, вероятно, 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 -type d
find . -mindepth 1 -maxdepth 1 -type d ...
Я использую, 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
-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"
это только так?