Виключити приховані файли при пошуку за допомогою пошуку Unix / Linux?


35

Які параметри мені потрібно використовувати findдля виключення прихованих файлів?


4
Убік: причина цього не має особливої ​​підтримки для цього завдання в тому, що єдине, що стосується файлів, названих провідним '.' полягає в тому, що вони не перераховані, lsякщо спеціально не вимагається: вони є абсолютно звичайними файлами в будь-якому відношенні, саме це lsдозволяє ігнорувати їх за замовчуванням.
dmckee

2
Питання: чи хочете ви щось сховати .hidden/visible.txt?
Кіт Томпсон

Відповіді:


14

Я знайшов це тут :

find . \( ! -regex '.*/\..*' \) -type f -name "whatever"

Чому б не просто \( ! -name '.*' \)?
grawity

@grawity Я щойно це виявив, я не знаю повністю, як це працює. Чи хотіли б ваші не лише заховати приховані файли, але й приховані каталоги та весь їхній вміст та приховані файли у папках?
Jarvin

5
Ні, не буде: / Але \( ! -path '*/.*' \)б.
grawity

@grawity Я, я думаю, я зробив припущення про те, чого хотів ОП ... Ваше рішення-ім'я, мабуть, найближче до того, що вони просили.
Jarvin

@ grawity & Dan: Чи не так (! -путь '^. *') ?? ваші рішення ігнорують будь-який файл із символом "." в будь-якому місці назви файлу, наприклад a.exe, b.out і т. д. ....
Механік програмного забезпечення

13

Здається, заперечення глобальної картини недостатньо відоме. Отже, ви можете використовувати:

find . -name "[!.]*"

12

Це не відповідає на ваше запитання, але для завдання пошуку не прихованих файлів мені подобається знайти знайти всі файли, а потім відфільтрувати за допомогою грепа.

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

Схожий на ваш підхід, але, можливо, трохи простіше.


Це був єдиний з тих, хто працював на мене.
entpnerd

7

Спробуйте наступне findвикористання:

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

Який би ігнорував усі приховані файли (файли та каталоги, починаючи з крапки).


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 Роздрукуйте кожен файл, який буде шукати, не фактично виконуючи пошук.


1

fd

Використання fd, проста, набагато швидша та зручна для користувача альтернатива find. За замовчуванням це:

  • За замовчуванням ігнорує приховані каталоги та файли.
  • .gitignoreЗа замовчуванням ігнорує шаблони .

Перевірте аналіз бенчмарка .


1

Щоб знайти приховані файли:

find -name '[.]*'

Щоб знайти видимі файли:

find -name '[!.]*'

Це так просто.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.