Учитывая следующую структуру каталогов:
$ tree --noreport dir
dir
├── fileA
├── .hiddenfileA
├── .hiddendirA
| ├── .hiddenfileB
│ ├── fileC
│ └── fileD
└── dirA
├── .hiddenfileC
├── fileE
└── fileF
Требуется выполнить вызов find таким образом, чтобы файлы из скрытых каталогов, но не скрытые файлы (в нескрытых каталогах) были исключены из результата.
Ожидаемая доходность должна быть примерно такой:
./.hiddenfileA
./dirA/.hiddenfileC
./dirA/fileE
./dirA/fileF
./fileA
Провел небольшое исследование и обнаружилздесьинформация, которая побудила меня создать следующий призывfind
$ find . -type f -not -path '*/\.*' -print
Но у этого решения есть недостаток: оно пропускает скрытые каталоги.и файлы.
решение1
Удалить скрытые каталоги и ограничить результаты файлами:
find . -type d -name '.?*' -prune -o -type f -print
Как и предполагалjhill, вы можете предпочесть отфильтровать каталоги, что приведет к отображению файлов, ссылок и т. д.:
find . -type d -name '.?*' -prune -o ! -type d -print
решение2
Ваша команда очень близка к работе. Используйте
find . -type f ! -path '*/.*/*' -print
- Шаблон пути,
*/.*/*
ищет/.
(подразумевая имя сегмента, начинающееся с.
) последовало(в конце концов)ка/
— поэтому имя сегмента, которое начинается с.
не может быть последним (именем файла); т. е. это должно быть имя каталога. -path
использует шаблоны расширения имени файла; также известные как globs или wildcards. Поэтому вам не нужно ставить\
перед.
.- Не используйте
-not
, если вам нужна переносимость на не-GNU системы. Использование!
для представления «не» указано в POSIX и работает в любой версииfind
(даже в BSD, Solaris и т. д. и древних системах).