Исключить скрытые файлы при поиске в Unix / Linux find?

35

Какие параметры мне нужно использовать, findчтобы исключить скрытые файлы?

therefromhere
источник
4
Кроме того: причина, по которой не существует особой поддержки для этой задачи, заключается в том, что единственное, что особенное в файлах с именами, начинающимися с '.' в том, что их нет в списке, lsесли не указано иное: они являются совершенно обычными файлами во всех отношениях, просто они lsпозволяют игнорировать их по умолчанию.
dmckee
2
Вопрос: вы хотите что-то скрыть .hidden/visible.txt?
Кит Томпсон

Ответы:

14

Я нашел это здесь :

find . \( ! -regex '.*/\..*' \) -type f -name "whatever"
Jarvin
источник
Почему не просто \( ! -name '.*' \)?
Гравитация
@ Grawity Я только что нашел это, я не знаю полностью, как это работает. Будут ли ваши скрывать не только скрытые файлы, но и скрытые каталоги, а также весь их субконтент и скрытые файлы в подпапках?
Джарвин
5
Нет, не будет: / Но \( ! -path '*/.*' \)будет.
Гравитация
@ grawity Да, я полагаю, что сделал предположение о том, что хотел ОП ... Ваше решение с именем-имя, вероятно, наиболее близко к тому, о чем они просили.
Джарвин
@ grawity & Dan: не так ли (! -path '^. *') ?? ваши решения будут игнорировать любой файл, который имеет «.» в любом месте имени файла, например, a.exe, b.out и т. д.
Software Mechanic
13

Похоже, что шаблон негатива не известен. Таким образом, вы можете использовать:

find . -name "[!.]*"
Красная точка
источник
12

Это не отвечает на ваш вопрос, но для задачи поиска не скрытых файлов я хотел бы позволить find найти все файлы, а затем отфильтровать с помощью grep.

find . -type f | grep -v '/\.'

Похож на ваш подход, но, возможно, немного проще.

Саймон Чан
источник
Это был единственный лайнер, который работал на меня.
entpnerd
7

Попробуйте следующее findиспользование:

find . -type f -not -path '*/\.*'

Что бы игнорировать все скрытые файлы (файлы и каталоги, начинающиеся с точки).

kenorb
источник
1

Я написал скрипт, findnhкоторый, как мне кажется, обрабатывает некоторые крайние случаи лучше, чем ответы на этот вопрос, которые я смог найти в Интернете.

#!/bin/bash

declare -a paths

while [ $# -ne 0 ]; do
  case "$1" in -*) break ;; esac
  paths+=("$1")
  shift
done

find "${paths[@]}" \( -name . -o -name .. -o \! \( -name '.*' -prune \) \) "$@"

Например, вы можете найти не скрытые файлы и каталоги внутри явно указанного скрытого каталога с помощью команды вроде findnh ~/.hiddendir/, которая будет отображаться, ~/.hiddendir/fileно не отображается ~/.hiddendir/.superhiddenfile.

Курт Гластеттер
источник
1
Хорошая часть кода. Кроме того, когда я пытаюсь findnh ~/.hiddendir/, я ничего не получаю. Кроме этого, как это отличается от ! -path '*/.*'и find … | grep -v '/\.'?
G-Man говорит: «Восстановите Монику»
1

Если цели является findи grep, ripgrepдействительно исключают скрытые файлы по умолчанию, например ,

rg --files

--files Напечатайте каждый файл, который будет искать, фактически не выполняя поиск.

kenorb
источник
1

fd

Используйте fdпростую, намного более быструю и удобную альтернативу find. По умолчанию это:

  • По умолчанию игнорирует скрытые каталоги и файлы.
  • .gitignoreПо умолчанию игнорирует шаблоны от вашего .

Проверьте контрольный анализ .

kenorb
источник
1

Чтобы найти скрытые файлы:

find -name '[.]*'

Чтобы найти видимые файлы:

find -name '[!.]*'

Это так просто.

Павел
источник