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"это только так?