file - programa - Especificación de texto para un árbol de archivos?
obtener ruta de un archivo c# (7)
Apache Ant proporciona ''pecas hormonales o patrones donde:
**/foo/**/*.java
significa "cualquier archivo que termine en ''.java'' en un directorio que incluya un directorio llamado ''foo'' en su ruta" - incluyendo ./foo/X.java
Estoy buscando ejemplos de especificar archivos en una estructura de árbol, por ejemplo, para especificar el conjunto de archivos para buscar en una herramienta grep. Me gustaría poder incluir y excluir archivos y directorios por coincidencia de nombres. Estoy seguro de que hay ejemplos por ahí, pero estoy teniendo dificultades para encontrarlos.
Aquí hay un ejemplo de una posible sintaxis:
*.py *.html
*.txt *.js
-*.pyc
-.svn/
-*combo_*.js
(Esto significa incluir el archivo con extensiones .py.html .txt .js, excluir archivos .pyc, cualquier cosa en un directorio .svn y cualquier archivo que coincida con combo_ .js)
Sé que he visto este tipo de especificaciones en otras herramientas antes. ¿Esto está sonando campanas para alguien?
find(1)
es una buena herramienta como se describió en la respuesta anterior, pero si se vuelve más complicado, debes considerar escribir tu propio script en cualquiera de los sospechosos habituales (Ruby, Perl, Python y otros) o intentar usar uno de los shells más potentes, como zsh, que tiene **
comandos globbing y puede especificar cosas para excluir. Sin embargo, este último es probablemente más complicado.
¿Qué tal find
en ambientes unixish?
Buscar puede, por supuesto, hacer más que crear una lista de archivos, pero esa es una de las formas comunes en que se usa. Desde la página man:
NAME find - recorre una jerarquía de archivos
SINOPSIS encontrar [-H | -L | -P] [-EXdsx] [-f ruta] nombre de ruta ... expresión encuentra [-H | -L | -P] [-EXdsx] -f ruta nombre [ruta nombre ...] expresión
DESCRIPCIÓN La utilidad de búsqueda desciende de forma recursiva el árbol de directorios para cada nombre de ruta enumerado, evaluando una expresión (compuesta por las
primaries'''' and
operandos '''' enumerados a continuación) en términos de cada archivo en el árbol.
para lograr tu objetivo escribiría algo así como (formateado para la legibilidad):
find ./ /( -name *.{py,html,txt,js,pyc} -or /
-name *combo_*.js -or /
/( -name *.svn -and -type d/)/) /
-print
Además, hay un patrón xargs
que usa xargs
que hace que sea adecuado para enviar toda la lista construida de esta forma a un comando arbitrario como en:
find /path -type f -print0 | xargs -0 rm
Es posible que desee verificar ack , que le permite especificar tipos de archivos para buscar con opciones como --perl
, etc.
También ignora los directorios .svn
de forma predeterminada, así como los volcados centrales, editor cruft, archivos binarios, etc.
No existe un formato estándar único para este tipo de cosas, pero si desea copiar algo ampliamente reconocido, eche un vistazo a la documentación de rsync
. Mire el capítulo sobre "NORMAS DE PATRÓN INCLUYE / EXCLUYA".
Si está utilizando bash, puede usar la extensión extglob
para obtener algunas funciones de globbing agradables. Habilítalo de la siguiente manera:
shopt -s extglob
Entonces puedes hacer cosas como las siguientes:
# everything but .html, .jpg or ,gif files
ls -d !(*.html|*gif|*jpg)
# list file9, file22 but not fileit
ls file+([0-9])
# begins with apl or un only
ls -d +(apl*|un*)
Ver también esta página .
En su sintaxis de ejemplo, ¿se entiende implícitamente que hay un carácter de escape para que pueda incluir explícitamente un archivo que comience con un guión? (La misma pregunta vale para cualquier otro carácter comodín, pero supongo que esperaría ver más archivos con guiones en sus nombres que asteriscos).
Varios shells de comandos usan * (y posiblemente? Para hacer coincidir un solo carácter), como en su ejemplo, pero generalmente solo coinciden con una cadena de caracteres que no incluye un separador de componentes de ruta (es decir, ''/' en sistemas Windows, '' / ''en otro lugar). También he visto aplicaciones de control de fuentes como Perforce, que usan patrones adicionales que pueden coincidir con los separadores de componentes de ruta. Por ejemplo, con Perforce, el patrón "foo / ... ext" (sin comillas) coincidirá con todos los archivos bajo la estructura de directorio foo / que finaliza con "ext", independientemente de si están en foo / sí o en uno de sus directorios descendientes. Este parece ser un patrón útil.