2012-09-04 12 views
6

que tienen una estructura de carpetas como esto (que es un pequeño fragmento):¿Cómo encontrar/grep todas las rutas donde el nombre del directorio coincide con "x" pero no con "y" con * nix?

└── test 
   └── cases 
      └── model 
         ├── client 
         │ ├── socketsTest.coffee 
         ├── server 
         │   └── socketsTest.coffee 
         └── shared 
          └── findersTest.coffee 

La pregunta es, ¿cómo usted enumera todos los caminos que terminan en .coffee y no existen en la carpeta client?

El siguiente comando devuelve todos los archivos que coinciden con .coffee que existen en la carpeta server:

find test -name "*Test.coffee" | egrep '/*server*/' 

Pero lo que realmente necesita es una expresión regular que coincide con todo lo excepto lo que hay en la carpeta del cliente.

¿Cuál es la forma más limpia de hacer esto en * nix? El objetivo final es devolver archivos no dentro de una carpeta client, así que para el árbol por encima de eso sería:

$ <find files except those a client folder> 
test/cases/model/server/socketsTest.coffee 
test/cases/model/shared/findersTest.coffee 

He intentado hacer algo como esto, pero sin suerte:

find test -name "*Test.coffee" | egrep '*model/[^client]*' 

Respuesta

10

Usted puede utilizar el -prune acción para ignorar directorios. -o significa "o", así que lea esto como "si se llama cliente, podelo, de lo contrario imprima archivos llamados *.coffee".

find test -name client -prune -o -name '*.coffee' -print 

o puede utilizar una doble prueba, que es más fácil de leer, pero un poco menos eficiente, ya que va a Recursividad en directorios client/, mientras que el primero de ellos evita por completo.

find test -name '*.coffee' ! -wholename '*/client/*' 
+0

impresionante, gracias ! Ambos son nuevos para mí. –

1

Recomendaría la respuesta -prune que da John Kugelman.

Otra forma de resolver este problema utilizando grep es utilizar la opción -v:

find test -name "*Test.coffee" | grep -v client 

-v invierte la coincidencia de patrón, por lo que todos los partidos que contienen "cliente" se descartan

Cuestiones relacionadas