Estaba tratando de obtener una lista de todos los archivos python y html en un directorio con el comando find Documents -name "*.{py,html}"
.
Luego apareció la página del manual:
Las llaves dentro del patrón ('{}') no se consideran especiales (es decir, find. -Name 'foo {1,2}' coincide con un archivo llamado foo {1,2}, no con los archivos foo1 y foo2.
Como esto es parte de una cadena de tuberías, me gustaría poder especificar qué extensiones coincide en tiempo de ejecución (sin codificación rígida). Si find simplemente no puede hacerlo, un perl one-liner (o similar) estaría bien.
Editar: La respuesta que finalmente se me ocurrió incluye todo tipo de basura, y también es un poco larga, así que la publiqué como respuesta a la picazón original que estaba tratando de rascar. Siéntete libre de hackear eso si tienes mejores soluciones.
locate
, aunque con la advertencia de que la actualización internab puede no estar actualizada. Pero es rapido.Respuestas:
Uso
-o
, que significa "o":Tendría que construir esa línea de comando mediante programación, lo cual no es tan fácil.
¿Estás usando bash (o Cygwin en Windows)? Si es así, debería poder hacer esto:
que podría ser más fácil de construir mediante programación.
fuente
**
búsqueda recursiva; Bash solo lo admite en las versiones 4.0 y posteriores, y solo conshopt -s globstar
.-name
s con paréntesis, si lo estás usando-exec
. Por ejemplofind Documents \( -name "*.py" -o -name "*.html" \) -exec file {} \;
-print0
para manejar nombres de archivos con espacios.Algunas ediciones de find, principalmente en sistemas Linux, posiblemente en otras, también admiten las opciones -regex y -regextype, que encuentran archivos con nombres que coinciden con la expresión regular.
por ejemplo
debería hacer el truco en el ejemplo anterior. Sin embargo, esta no es una función de búsqueda POSIX estándar y depende de la implementación.
fuente
find . -regex ".*\.\(py\|html\)$"
esto funciona porque encuentra valores predeterminados para las expresiones regulares de estilo Emacs, que son ligeramente diferentes, por lo que no tiene que especificar el tipo de expresión regular.-regextype posix-egrep
es útil (de lo contrario, necesitaría escapar de muchos caracteres). Este es el comando find que he usado para un dist-hook que construye un zip de distribución de Windows (encuentra los archivos para cambiar y en el archivo los cambia a dos-eol):find -regextype posix-egrep -regex ".*(\.([chyl]|def|cpy|cob|conf|cfg)|(README|ChangeLog|AUTHORS|ABOUT-NLS|NEWS|THANKS|TODO|COPYING.*))$" -exec sed -i -e 's/\r*$/\r/' {} \;
Podrías agregar más
-name
cláusulas mediante programación , separadas por-or
:O bien, elija un bucle simple:
fuente
*.py
archivos o tienes alguna versión extraña defind
. El comando mencionado anteriormente funciona bien.-iname
. Solo devuelve*.py
archivos si lo escribe en la última posición (también loiname *.html
es la primera expresión) . Yo uso el comando en Debian.Esto encontrará todos los archivos .c o .cpp en Linux
No necesita el paréntesis escapado a menos que esté haciendo algunas modificaciones adicionales. Aquí, desde la página de manual, dicen si el patrón coincide, imprímalo. Quizás están tratando de controlar la impresión. En este caso, -print actúa como un condicional y se convierte en un condicional "AND'd". Evitará que se impriman los archivos .c.
Pero si le gusta la respuesta original, puede controlar la impresión. Esto también encontrará todos los archivos .c.
Un último ejemplo para todos los archivos fuente c / c ++
fuente
Tenía una necesidad similar Esto funcionó para mí:
fuente
()
find -name "*.cpp" -o -name "*.c" -o -name "*.cc" -print0
tuve que usar un par de parens para agrupe el segundo u operador.find -name "*.cpp" -o \( -name "*.c" -o -name "*.cc" \) -print0
Puede ser que -print0, que siempre es "verdadero", haya afectado la lógica.Mi defecto ha sido:
find -type f | egrep -i "*.java|*.css|*.cs|*.sql"
Al igual que el proceso menos ejecutivo de
find
ejecución por Brendan Long y Stephan202 et al .:fuente
egrep
regexp, más bien, tienes un globo de shell donde se debe usar una expresión regular. (Además, elfind
uso típico es:,find {directory} [options...] [action]
donde, según impl,directory
puede ser predeterminado.
yaction
predeterminado-print
, pero seré explícito). Entonces, en su lugar, use algo como:find . -type f -print | egrep -i '\.java$|\.css$|\.cs$|\.sql$'
Pero también, como alternativa realmente rápida afind
, uno también podría intentelocate
de manera similar (aunque no necesariamente actualizado, ya que consulta una base de datos interna para obtener una lista de archivos)simple pero funciona :)
fuente
Necesitaba eliminar todos los archivos en directorios secundarios, excepto algunos archivos. Lo siguiente funcionó para mí (tres patrones especificados):
fuente
\(\)
Se requieren llaves dentro del patrón para el patrón de nombre conor
Mientras que para el patrón de nombre con
and
operador no es necesariofuente
Esto funciona en AIX Korn Shell.
Esto está buscando
*.cbl
o*.dms
que tienen 1 día de antigüedad, solo en el directorio actual, omitiendo los subdirectorios.fuente
fuente
Qué pasa
Enumera todos los archivos que terminan con .py o .html en sus nombres de archivo
fuente