Cómo encontrar solo archivos en un directorio dado e ignorar subdirectorios usando bash

129

Miré otras preguntas similares, pero no encontré una que me permitiera comprender el concepto y hacerlo aplicable a mi situación en función de mi tiempo limitado. 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:

Los archivos / patrones en los que estoy interesado: / dev / abc-scanner, / dev / abc-cash ...

El comando:

find /dev/ -name 'abc-*'

Lo que se devuelve:

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

Quiero ignorar los últimos archivos: /dev/.udev / ...

suffa
fuente
9
ignorar subdirectorios específicos, o no descender a ningún subdirectorio? Para este último, use la opción -maxdepth 1
frankc
@frankc Publícalo como respuesta.
cnicutar
posible duplicado del directorio excluir de buscar. comando
Restablecer Monica Please

Respuestas:

202

Si solo desea limitar la búsqueda al primer nivel, puede hacer lo siguiente:

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

... o si particularmente desea excluir el .udevdirectorio, puede hacer:

 find /dev -name '.udev' -prune -o -name 'abc-*' -print
Mark Longair
fuente
Si quisiera enumerar dónde se encuentran todos los enlaces simbólicos anteriores en el patrón anterior, ¿usaría una tubería? Algo así como find / dev -maxdepth 1 -name 'abc- *' | ls -l
suffa
1
Es mejor usarlo xargs, así que algo así como: find /dev -maxdepth 1 -name 'abc-*' | xargs ls -lpero si hay alguna posibilidad de que tengan espacios en blanco en los nombres, deberías hacerlofind /dev -maxdepth 1 -name 'abc-*' -print0 | xargs -0 ls -l
Mark Longair
Sin embargo, como señala la respuesta de Stephen Darlington , no estoy seguro de por qué no lo haríasls -l /dev/abc-*
Mark Longair
Además, si desea averiguar a dónde apuntan los enlaces simbólicos, puede hacerlofor x in /dev/abc-*; do readlink -f $x; done
Mark Longair
1
O si desea subdirectorios solo en el primer nivel, ls -l /dev/abc-* /dev/*/abc-* | fgrep -v /dev/.udev... excepto que al menos en mi Linux /dev/*/*no incluye archivos, por /dev/.udev/*lo que puede omitir el fgrep -v.
tripleee
9

¿Hay alguna razón en particular que necesites usar find? Simplemente puede usar lspara buscar archivos que coincidan con un patrón en un directorio.

ls /dev/abc-*

Si necesita usarlo find, puede usar el -maxdepth 1interruptor para aplicar solo al directorio especificado.

Stephen Darlington
fuente
Creo que te refieres en -maxdepth 1lugar de-maxdepth 0
Mark Longair
55
Cabe señalar que el comodín es la parte importante aquí, no ls. Puede encontrar los mismos archivos con echoo con wclo que tiene, porque el shell expande el comodín por usted. Entonces, for file in /dev/abc-*; do something with each "$file"; donepodría ser lo que el OP realmente está buscando.
tripleee
1
Ah, nunca recuerdo en qué dirección está ... Gracias por la edición. Además, vale la pena señalar que no es universal. La versión de Solaris de findno lo tiene, por ejemplo.
Stephen Darlington
@tripleee +1. Sip. Hacerlo todo en el shell sería preferible si es posible.
Stephen Darlington
1
@MustafaOzturk El lses superfluo. for f in abc*; ...es todo lo que necesitas.
Stephen Darlington el
4

Esto puede hacer lo que quieras:

find /dev \( ! -name /dev -prune \) -type f -print
Chris J
fuente
2
Si, esto funciona. -maxdepth no está implementado en find en algunos Unixes más antiguos.
CCTO
-1
find /dev -maxdepth 1 -name 'abc-*'

No funciona para mi No devuelve nada. Si solo hago '.' me da todos los archivos en el directorio debajo del que estoy trabajando.

find /dev -maxdepth 1 -name "*.root" -type 'f' -size +100k -ls

No devuelva nada con '.' en su lugar obtengo una lista de todos los archivos 'grandes' en mi directorio, así como el directorio raíz / donde guardo los archivos antiguos.

Continuo. Esto funciona.

find ./ -maxdepth 1 -name "*.root" -type 'f' -size +100k -ls
564751   71 -rw-r--r--   1 snyder   bfactory   115739 May 21 12:39 ./R24eTightPiPi771052-55.root
565197  105 -rw-r--r--   1 snyder   bfactory   150719 May 21 14:27 ./R24eTightPiPi771106-2.root
565023   94 -rw-r--r--   1 snyder   bfactory   134180 May 21 12:59 ./R24eTightPiPi77999-109.root
719678   82 -rw-r--r--   1 snyder   bfactory   121149 May 21 12:42 ./R24eTightPiPi771098-10.root
564029  140 -rw-r--r--   1 snyder   bfactory   170181 May 21 14:14 ./combo77v.root

Aparentemente /dev significa directorio de interés. Pero ./es necesario, no solo .. La necesidad de esto /no era obvia incluso después de que descubrí qué /devsignificaba más o menos.

No pude responder como un comentario porque no tengo 'reputación'.

Athur Snyder
fuente
1
Ganas reputación dando buenas respuestas. Lea este stackoverflow.com/conduct
aifrim
Hay razones por las que no puedes comentar y eso no te da permiso para poner comentarios aquí en la sección Respuesta. Por favor borre esto.
Rob