Использовать find, чтобы найти скрытые файлы, но игнорировать файлы DS_Store.

Вопрос или проблема

Я пытаюсь использовать find, чтобы найти файлы…

  • которые скрыты с помощью chflags, например, chflags hidden my_file
  • или имена файлов которых начинаются с точки, например, .my_file
  • и игнорировать специфичные для macOS файлы .DS_Store

Текущая версия выглядит так

find . -mindepth 1 -maxdepth 1 -name '.*' -not -name '.DS_Store' -o -flags -hidden

Но это не исключает файлы .DS_Store. Как это исправить?

Переместите и сгруппируйте ваши предикаты:

find . -mindepth 1 -maxdepth 1 ! -name .DS_Store \( -name '.*' -o -flags -hidden \)

Ваша оригинальная команда,

find . -mindepth 1 -maxdepth 1 -name '.*' ! -name .DS_Store -o -flags -hidden

… такая же как

find . -mindepth 1 -maxdepth 1 \( -name '.*' ! -name .DS_Store \) -o -flags -hidden

… и поскольку файлы .DS_Store имеют флаг hidden, они перечисляются.

Ответ или решение

Для поиска скрытых файлов в операционной системе macOS с помощью команды find, одновременно исключая файлы .DS_Store, необходимо учитывать правильную структуру логических условий в команде. Ваша изначальная команда имеет некоторые недостатки, которые могут привести к включению файлов, которые вы хотите исключить.

Проблема с изначальной командой

Команда, которую вы представили:

find . -mindepth 1 -maxdepth 1 -name '.*' -not -name '.DS_Store' -o -flags -hidden

включает в себя операцию -o (или), которая может привести к тому, что система будет возвращать файлы с флагом "скрытый", включая .DS_Store, даже когда вы пытаетесь их исключить.

Решение: Структура условий

Чтобы избежать этой проблемы, нужно перепорядочить и сгруппировать условия. Правильная команда будет выглядеть следующим образом:

find . -mindepth 1 -maxdepth 1 ! -name '.DS_Store' \( -name '.*' -o -flags hidden \)

Подробное объяснение:

  1. -mindepth 1 и -maxdepth 1: Эти параметры указывают на то, что мы ищем только в текущем каталоге, исключая родительский каталог.

  2. ! -name '.DS_Store': Этот параметр используется для исключения файла .DS_Store. Важно разместить его перед следующими условиями для того, чтобы гарантировать, что он правильно применяется ко всем найденным файлам.

  3. *`( -name ‘.‘ -o -flags hidden )**: Эта группа условий позволяет находить файлы, которые либо имеют имена, начинающиеся с точки (что указывает на скрытые файлы), либо те, которые помечены как скрытые с помощьюchflags. Скобки(и)` группируют эти условия, чтобы гарантировать, что они обрабатываются вместе.

Результаты выполнения

Используя данную команду в терминале, вы получите список всех скрытых файлов (как с именами, начинающимися с точки, так и с флагом "hidden"), кроме файлов .DS_Store. Это может быть полезно для администраторов систем и разработчиков, которые работают с macOS и хотят эффективно управлять файлами.

Заключение

Правильно структурированная команда find является мощным инструментом для поиска и управления файлами в macOS. Следуя вышеприведенным рекомендациям, вы сможете легко находить скрытые файлы и избегать ненужных результатов.

Оцените материал
Добавить комментарий

Капча загружается...