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 grep
serí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 text
su nombre y desea omitir archivos y directorios ocultos, ejecute:Explicación:
La
-path
opció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.-not
significa no seleccionar archivos que coincidan con esta prueba.No creo que
find
sea lo suficientemente inteligente como para evitar la búsqueda recursiva de directorios ocultos en el comando anterior, así que si necesita velocidad, use-prune
en su lugar, así:fuente
-print
al 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?find
significa el directorio actual:find
examinará todos los archivos y directorios en el directorio actual. El argumento posteriorpath
es 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-name
no 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:
$PWD
imprime la ruta completa al directorio actual para que la ruta no comience con./
-name ".*" -prune
coincide con cualquier archivo o directorio que comience con un punto y luego no descienda-o -print
significa imprimir el nombre del archivo si la expresión anterior no coincide con nada. Usar-print
o-print0
hace que todas las demás expresiones no se impriman de manera predeterminada.fuente
-o ... -print
es ú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 -print
No tienes que usar
find
para eso. Solo usa globstar en shell, como:o:
donde
**/
representa cualquier carpeta recursivamente y*foo*
cualquier archivo que tengafoo
en su nombre.De forma predeterminada, el uso
ls
imprimirá 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
ls
para 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 d
en la expresión que se está podando.Por ejemplo:
En este caso
-type d -path '*/.*'
estrue
solo para directorios, por lo que solo se eliminan los directorios.fuente
find
tiene interruptores lógicos limpios como-and
y-not
puede usarlos a su favor para encontrar un archivo coincidente con dos reglas como esta: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 conhidden_file
él pero sin punto inicial. Tenga en cuenta las barras delante del paréntesis: se utilizan para definir paréntesis comofind
argumentos en lugar de definir una subshell (que es lo que significa paréntesis de lo contrario sin barras)fuente
Notas:
.
: carpeta actual-maxdepth 1
para buscar de forma recursiva-type f
: buscar archivos, no directorios (d
)-not -path '*/\.*'
: no volver.hidden_files
sed 's/^\.\///g'
: elimina el antepuesto./
de la lista de resultadosfuente