encontrar sin recursividad


246

¿Es posible usar el findcomando de alguna manera para que no vuelva a aparecer en los subdirectorios? Por ejemplo,

DirsRoot
  |-->SubDir1
  |    |-OtherFile1
  |-->SubDir2
  |    |-OtherFile2
  |-File1
  |-File2

¿Y el resultado de algo así find DirsRoot --donotrecuourse -type fserá solo File1, File2?

Respuestas:


380

Creo que obtendrá lo que desea con la -maxdepth 1opción, según su estructura de comando actual. Si no es así, puede intentar mirar la página del manual para find.

Entrada relevante (por conveniencia):

-maxdepth levels
          Descend at most levels (a non-negative integer) levels of direc-
          tories below the command line arguments.   `-maxdepth  0'  means
          only  apply the tests and actions to the command line arguments.

Sus opciones son básicamente:

find DirsRoot/* -maxdepth 0 -type f #This does not show hidden files

O:

find DirsRoot/ -maxdepth 1 -type f #This does show hidden files

Para el ejemplo del OP, creo que esto debe ser -maxdepth 1?
Paul R

@Paul R: En realidad, ese tipo de depende de cómo quiera manejar los archivos ocultos, pero de todos modos he modificado mi respuesta. Por su ejemplo 1es probablemente lo que quiere.
eldarerathis

1
Para mí, -maxdepth 0no muestra ningún archivo pero -maxdepth 1funciona según lo previsto, y también se muestran archivos ocultos.
Bruce Wayne

1
@BruceWayne tenga *en cuenta la entrada find DirsRoot/* -maxdepth 0 -type f. Si deja eso fuera, no mostrará ningún archivo.
mapeters

@mook, gracias, pero no recuerdo el contexto original en el que tuve este problema, jaja.
Bruce Wayne


17

Si busca una solución compatible con POSIX:

cd DirsRoot && find . -type f -print -o -name . -o -prune

-maxdepth no es una opción compatible con POSIX.


gracias por esta solución, pero ¿no se puede simplificar esto find DirsRoot/* -type f -prune?
dokaspar

@dokaspar Muy buena pregunta! (olvidó insertar "-o" antes por -prunecierto) La respuesta es no, no puede. Para comprender completamente POR QUÉ no se puede simplificar, simplemente emita un set -xcomando antes de emitir el find DirsRoot/* -type f -o -prunee inmediatamente lo verá usted mismo. La causa raíz son las limitaciones de la expansión de la shell de DirsRoot/*expresión.
sqr163

¡No funciona en centos, sigue haciendo recursión completa en la salida! El comando correcto esfind . -name . -o -prune
Reishin el

en Solaris de todos modos, manteniendo DirsRoot como la ruta deseada, no necesita cd; en su lugar, puede: encontrar DirsRoot /. -tipo f -print -o -name. -o -prune
spioter
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.