¿Excluir archivos ocultos al buscar con Unix / Linux find?

35

¿Qué opciones necesito usar findpara excluir archivos ocultos?

de allí
fuente
44
Aparte: la razón por la que no hay un soporte especial para esta tarea es que lo único especial acerca de los archivos nombrados con un '.' es que no se enumeran a lsmenos que se solicite específicamente: son archivos completamente normales en todos los aspectos, es solo que lste permite ignorarlos de forma predeterminada.
dmckee
2
Pregunta: ¿quieres esconder algo como .hidden/visible.txt?
Keith Thompson el

Respuestas:

14

Encontré esto aquí :

find . \( ! -regex '.*/\..*' \) -type f -name "whatever"
Jarvin
fuente
¿Por qué no solo \( ! -name '.*' \)?
Grawity
@grawity Acabo de encontrar eso, no sé completamente cómo funciona. ¿El suyo no solo ocultaría archivos ocultos, sino también directorios ocultos y todo su contenido y archivos ocultos en subcarpetas?
Jarvin
55
No, no lo haría: / Pero lo \( ! -path '*/.*' \)haría.
Grawity
@grawity Ya, supongo que asumí lo que quería el OP ... Su solución de nombre es probablemente la más cercana a lo que estaban pidiendo.
Jarvin
@ Grawity & Dan: ¿No es (! -path '^. *') ?? sus soluciones ignorarán cualquier archivo que tenga un '.' en cualquier parte del nombre del archivo, como a.exe, b.out, etc ...
Software Mechanic
13

Parece que el patrón de negación global no se conoce bien. Entonces puedes usar:

find . -name "[!.]*"
punto rojo
fuente
12

Esto no responde a su pregunta, pero para la tarea de encontrar archivos no ocultos, me gusta dejar encontrar todos los archivos y luego filtrarlos con grep.

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

Similar a su enfoque, pero quizás un poco más simple.

Simon Chiang
fuente
Este fue el único de los revestimientos que funcionó para mí.
entpnerd
7

Pruebe el siguiente finduso:

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

Lo que ignoraría todos los archivos ocultos (archivos y directorios que comienzan con un punto).

kenorb
fuente
1

Escribí un script llamado findnhque creo que maneja ciertos casos extremos mejor que las respuestas a esta pregunta que he podido encontrar en la web.

#!/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 \) \) "$@"

Por ejemplo, puede encontrar archivos y directorios no ocultos dentro de un directorio oculto especificado explícitamente con un comando como findnh ~/.hiddendir/, que se mostrará ~/.hiddendir/filepero no ~/.hiddendir/.superhiddenfile.

Kurt Glastetter
fuente
1
Buen bit de codificación. Excepto que, cuando lo intento findnh ~/.hiddendir/, no obtengo nada. Aparte de eso, ¿cómo es esto diferente de ! -path '*/.*'y find … | grep -v '/\.'?
G-Man dice 'reinstalar a Monica' el
1

Si objetivos es findy grep, ripgrepexcluye los archivos ocultos de forma predeterminada, por ejemplo,

rg --files

--files Imprima cada archivo que se buscaría sin realizar realmente la búsqueda.

kenorb
fuente
1

fd

Use fd, una alternativa simple, mucho más rápida y fácil de usar find. Por defecto, esto:

  • Ignora los directorios y archivos ocultos, por defecto.
  • Ignora los patrones de su .gitignore, por defecto.

Verifique el análisis de referencia .

kenorb
fuente
1

Para buscar archivos ocultos:

find -name '[.]*'

Para buscar archivos visibles:

find -name '[!.]*'

Es así de simple.

Carmin
fuente