¿Cómo excluir / ignorar los archivos y directorios ocultos en una búsqueda "encontrar" incrustada en un comodín?

97

A partir de (observe los comodines antes y después de "texto")

find . -type f -name '*some text*'

¿cómo se puede excluir / ignorar todos los archivos y directorios ocultos?

Ya he estado buscando en Google demasiado tiempo , encontré algunos -prune y! (signo de exclamación), pero no el ejemplo apropiado (y parsimonioso) que acaba de funcionar .

Tubería | to grep sería una opción y también agradecería ejemplos de eso; pero principalmente me interesa una breve presentación (o un par de frases sueltas independientes, que ilustran diferentes maneras de lograr el mismo objetivo en la línea de comandos) solo usando find .

ps: Encuentre archivos en Linux y excluya directorios específicos parece estrechamente relacionado, pero a) no se acepta aún yb) está relacionado -pero-diferente-y-distinto, pero c) puede proporcionar inspiración y ayudar a identificar la confusión.

Editar

find . \( ! -regex '.*/\..*' \) -type f -name "whatever" , funciona. La expresión regular busca "cualquier cosa, luego una barra, luego un punto, luego cualquier cosa" (es decir, todos los archivos y carpetas ocultos, incluidas sus subcarpetas), y el "!" niega la expresión regular.

    
pregunta nutty about natty 10.03.2013 - 12:58

6 respuestas

3

La respuesta originalmente publiqué como una "edición" a mi pregunta original anterior:

find . \( ! -regex '.*/\..*' \) -type f -name "whatever" , funciona. La expresión regular busca "cualquier cosa, luego una barra, luego un punto, luego cualquier cosa" (es decir, todos los archivos y carpetas ocultos, incluidas sus subcarpetas), y el "!" niega la expresión regular.

    
respondido por el nutty about natty 11.08.2015 - 09:31
108

Imprime todos los archivos que son descendientes de su directorio, salteando archivos y directorios ocultos:

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

Si está buscando un archivo con some text en su nombre y desea omitir archivos y directorios ocultos, ejecute:

find . -not -path '*/\.*' -type f -name '*some text*'

Explicación:

La opción -path ejecuta un patrón contra toda la cadena de ruta. * es un comodín, / es un separador de directorio, \. es un punto (tiene que ser escapado para evitar un significado especial), y * es otro comodín. -not significa que no se seleccionan los archivos que coinciden con esta prueba.

No creo que find sea lo suficientemente inteligente como para evitar buscar recursivamente directorios ocultos en el comando anterior, por lo que si necesita velocidad, use -prune en su lugar, así:

 find . -type d -path '*/\.*' -prune -o -not -name '.*' -type f -name '*some text*' -print
    
respondido por el Flimm 09.07.2013 - 18:30
6

Este es uno de los pocos medios para excluir archivos de puntos que también funcionan correctamente en BSD, Mac y Linux:

find "$PWD" -name ".*" -prune -o -print
  • $PWD imprime la ruta completa al directorio actual para que la ruta no comience con ./
  • -name ".*" -prune coincide con todos los archivos o directorios que comienzan con un punto y luego no descienden
  • -o -print significa imprimir el nombre del archivo si la expresión anterior no coincide con nada. El uso de -print o -print0 hace que las demás expresiones no se impriman de manera predeterminada.
respondido por el eradman 24.03.2016 - 14:51
4
find $DIR -not -path '*/\.*' -type f \( ! -iname ".*" \)

Excluye todos los directorios ocultos y los archivos ocultos en $ DIR

    
respondido por el guest 28.02.2014 - 01:49
3

No tiene que usar find para eso. Simplemente use globstar en el propio shell, como:

echo **/*foo*

o:

ls **/*foo*

donde **/ representa cualquier carpeta recursivamente y *foo* cualquier archivo que tenga foo en su nombre.

De forma predeterminada, el uso de ls imprimirá los nombres de los archivos, excluidos los archivos y directorios ocultos.

Si no tiene habilitado el globbing, hágalo por shopt -s globstar .

Nota: Una nueva opción de globbing funciona en Bash 4, zsh y conchas similares.

Ejemplo:

$ mkdir -vp a/b/c/d
mkdir: created directory 'a'
mkdir: created directory 'a/b'
mkdir: created directory 'a/b/c'
mkdir: created directory 'a/b/c/d'
$ touch a/b/c/d/foo a/b/c/d/bar  a/b/c/d/.foo_hidden a/b/c/d/foo_not_hidden
$ echo **/*foo*
a/b/c/d/foo  a/b/c/d/foo_not_hidden
    
respondido por el kenorb 20.04.2015 - 11:49
1

find tiene conmutadores lógicos claros como -and y -not ; puedes usarlos para tu ventaja para encontrar un archivo coincidente con dos reglas como esta:

$ touch non_hidden_file.txt .hidden_file.txt somethings/.another_hidden_file.txt                                                 

$ find . -type f -name '*hidden_file*' -and \( -not -name ".*" \)                            
./non_hidden_file.txt

Como puede ver, find usa dos reglas -name '*hidden_file*' y -and \( -not -name ".*" \) para encontrar los nombres de archivo que coinciden con ambas condiciones - nombre de archivo con hidden_file en él, pero sin punto inicial. Tenga en cuenta las barras delante de los paréntesis: se usan para definir paréntesis como find argumentos en lugar de definir una subcadena (que es lo que significa paréntesis de lo contrario sin barras)

    
respondido por el Sergiy Kolodyazhnyy 16.05.2017 - 00:01

Lea otras preguntas en las etiquetas