Исключить файлы из скрытых каталогов, но не скрытые файлы (в не скрытых каталогах) из результатов поиска

Исключить файлы из скрытых каталогов, но не скрытые файлы (в не скрытых каталогах) из результатов поиска

Учитывая следующую структуру каталогов:

$ 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 и т. д. и древних системах).

Связанный контент