A partir de (observe los comodines antes y después de "algún 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 durante demasiado tiempo , encontré algo de ciruela y! (signo de exclamación) parámetros, pero no hay un ejemplo apropiado (y parsimonioso) que simplemente funcionó .
Tubería | a grepsería una opción y también agradecería ejemplos de eso; pero principalmente estoy interesado en una breve línea (o un par de líneas independientes, que ilustran diferentes formas de lograr el mismo objetivo de línea de comandos) simplemente usando find.
ps: Buscar archivos en Linux y excluir directorios específicos parece estar estrechamente relacionado, pero a) aún no se acepta yb) está relacionado pero es diferente y distinto, pero c) puede proporcionar inspiración y ayudar a identificar la confusión.
Editar
find . \( ! -regex '.*/\..*' \) -type f -name "whatever", trabajos. La expresión regular busca "cualquier cosa, luego una barra diagonal, luego un punto, luego cualquier cosa" (es decir, todos los archivos y carpetas ocultos, incluidas sus subcarpetas), y el "!" niega la expresión regular.
fuente

Respuestas:
Esto imprime todos los archivos que son descendientes de su directorio, omitiendo los archivos y directorios ocultos:
Entonces, si está buscando un archivo con
some textsu nombre y desea omitir archivos y directorios ocultos, ejecute:Explicación:
La
-pathopción se ejecuta comprueba un patrón contra toda la cadena de ruta.*es un comodín,/es un separador de directorio,\.es un punto (se debe escapar para evitar un significado especial) y*es otro comodín.-notsignifica no seleccionar archivos que coincidan con esta prueba.No creo que
findsea lo suficientemente inteligente como para evitar la búsqueda recursiva de directorios ocultos en el comando anterior, así que si necesita velocidad, use-pruneen su lugar, así:fuente
-printal final! Además, no estoy seguro de si-name '\.*' would be more efficient instead of-path` (porque la ruta está buscando subrutas, pero se eliminarán).en este contexto?findsignifica el directorio actual:findexaminará todos los archivos y directorios en el directorio actual. El argumento posteriorpathes una expresión regular, donde un punto normalmente significaría "cualquier carácter", para que signifique un punto literal, tenemos que escapar con una barra diagonal inversa. El argumento posterior-nameno es una expresión regular, pero expande comodines como?y*como lo hace un shell..tener un significado especial... Por lo que yo sé, sólo éstos tienen que ser escapado:*,?, y[].Este es uno de los pocos medios para excluir archivos de puntos que también funcionan correctamente en BSD, Mac y Linux:
$PWDimprime la ruta completa al directorio actual para que la ruta no comience con./-name ".*" -prunecoincide con cualquier archivo o directorio que comience con un punto y luego no descienda-o -printsignifica imprimir el nombre del archivo si la expresión anterior no coincide con nada. Usar-printo-print0hace que todas las demás expresiones no se impriman de manera predeterminada.fuente
-o ... -printes útil. Para mi uso, ahora tengofind ... '!' -name . -name '.*' -prune -o ... -print, que era más conveniente que incluir $ PWD.Excluye todos los directorios ocultos y archivos ocultos bajo $ DIR
fuente
La respuesta que publiqué originalmente como una "edición" a mi pregunta original anterior:
find . \( ! -regex '.*/\..*' \) -type f -name "whatever", trabajos. La expresión regular busca "cualquier cosa, luego una barra diagonal, luego un punto, luego cualquier cosa" (es decir, todos los archivos y carpetas ocultos, incluidas sus subcarpetas), y el "!" niega la expresión regular.fuente
find . \( ! -regex './\..*' \) -type f -maxdepth 1 -printNo tienes que usar
findpara eso. Solo usa globstar en shell, como:o:
donde
**/representa cualquier carpeta recursivamente y*foo*cualquier archivo que tengafooen su nombre.De forma predeterminada, el uso
lsimprimirá los nombres de los archivos, excepto los archivos y directorios ocultos.Si no tiene habilitado el globbing, hágalo
shopt -s globstar.Nota: Una nueva opción de globbing funciona en Bash 4, zsh y shells similares.
Ejemplo:
fuente
lspara eso!echo **/*foo*/significa carpeta, separa los directorios del nombre del archivo.*Básicamente representa todo.La respuesta de @ Flimm es buena, particularmente porque evita que la búsqueda descienda a directorios ocultos . Prefiero esta simplificación:
Generalmente para excluir todas las rutas ocultas (archivos normales, directorios, etc.):
Por ejemplo, usando su directorio de trabajo como punto de inicio y
-name '*some text*'como expresión:En contraste con lo que sugiere la respuesta de @ Flimm, no hay archivos ocultos o directorios ocultos es el caso simple. La
-path '*/.*'expresión es cierto para cualquier camino (archivos regulares, directorios, etc.) que tiene una.inmediatamente después de su separador de archivos,/. Entonces, esta línea eliminará los archivos y directorios ocultos.Permitir archivos ocultos y excluir directorios ocultos es el caso que requiere un filtro adicional. Aquí es donde incluirías
-type den la expresión que se está podando.Por ejemplo:
En este caso
-type d -path '*/.*'estruesolo para directorios, por lo que solo se eliminan los directorios.fuente
findtiene interruptores lógicos limpios como-andy-notpuede usarlos a su favor para encontrar un archivo coincidente con dos reglas como esta:Como puede ver,
findusa dos reglas-name '*hidden_file*'y-and \( -not -name ".*" \)para encontrar los nombres de archivo que coinciden con ambas condiciones: nombre de archivo conhidden_fileél pero sin punto inicial. Tenga en cuenta las barras delante del paréntesis: se utilizan para definir paréntesis comofindargumentos en lugar de definir una subshell (que es lo que significa paréntesis de lo contrario sin barras)fuente
Notas:
.: carpeta actual-maxdepth 1para buscar de forma recursiva-type f: buscar archivos, no directorios (d)-not -path '*/\.*': no volver.hidden_filessed 's/^\.\///g': elimina el antepuesto./de la lista de resultadosfuente