2011-10-10 12 views
61

Miré otras preguntas similares, pero no encontré ninguna que me permitiera captar el concepto y hacerlo aplicable a mi situación en función de mi limitada hora. Simplemente estoy ejecutando el comando find para encontrar ciertos archivos, pero algunos archivos en subdirectorios tienen el mismo nombre que quiero ignorar. Gracias por cualquier ayuda. A continuación se muestra el comando que estoy usando:Cómo encontrar solo archivos en un directorio determinado, e ignorar los subdirectorios usando bash

El archivos/patrón que estoy interesado: /dev/abc-escáner,/dev/abc-efectivo ....

El comando:

find /dev/ -name 'abc-*' 

Lo que se volvió:

/dev/abc-scanner 
/dev/abc-cash 
... 
... 
... 
/dev/.udev/names/abc-scanner 
/dev/.udev/names/abc-cash 

quiero hacer caso omiso de los últimos archivos: /dev/.udev/...

+7

ignoran subdirectorios específicos, o no descender en cualquier subdire ctories? Para este último, use la opción -maxdepth 1 – frankc

+0

@frankc Publique como respuesta. – cnicutar

+0

posible duplicado de [excluir directorio de buscar. comando] (http://stackoverflow.com/questions/4210042/exclude-directory-from-find-command) – BroSlow

Respuesta

95

Si lo que desea es limitar el hallazgo al primer nivel que puede hacer:

find /dev -maxdepth 1 -name 'abc-*' 

... o si desea excluir todo el directorio .udev, que puede hacer:

find /dev -name '.udev' -prune -o -name 'abc-*' -print 
+0

Si quisiera enumerar a dónde se unen todos los enlaces simbólicos mencionados anteriormente en el patrón anterior, ¿usaría simplemente un tubo? Algo así como find/dev -maxdepth 1 -name 'abc- *' | ls -l – suffa

+1

En su lugar, es mejor usar 'xargs', algo así como:' find/dev -maxdepth 1 -name 'abc- *' | xargs ls -l' pero si hay alguna posibilidad de que tengan espacios en blanco en los nombres, debe hacer 'find/dev -maxdepth 1 -name 'abc- *' -print0 | xargs -0 ls -l' –

+0

Sin embargo, como [señala la respuesta de Stephen Darlington] (http://stackoverflow.com/questions/7715485/how-to-only-find-files-in-a-given-directory-and -ignore-subdirectories-using-bash/7715550 # 7715550), no estoy seguro de por qué no harías 'ls -l/dev/abc- *' –

7

¿Hay alguna razón en particular por la que necesite usar find? Simplemente puede usar ls para buscar archivos que coincidan con un patrón en un directorio.

ls /dev/abc-* 

Si necesita utilizar find, puede utilizar el interruptor -maxdepth 1 de aplicar únicamente en el directorio especificado.

+0

Creo que quieres decir '-maxdepth 1' en lugar de' -maxdepth 0' –

+4

Debe señalarse que el comodín es la parte importante aquí, no 'ls'. Puede encontrar los mismos archivos con 'echo' o' wc' o qué tiene usted, porque el shell expande el comodín por usted. Entonces 'para el archivo en/dev/abc- *; hacer algo con cada "$ file"; done' podría ser lo que el OP realmente está buscando. – tripleee

+1

Ah, nunca recuerdo qué camino tomar ... Gracias por la edición. Además, vale la pena señalar que no es universal. La versión de Solaris de 'find' no lo tiene, por ejemplo. –

2

Esto puede hacer lo que quiera:

find /dev \(! -name /dev -prune \) -type f -print 
+0

Sí, esto funciona. -maxdepth no está implementado en find en algunos Unixes más antiguos. – CCTO

Cuestiones relacionadas