Pregunta sobre find, linux, command-line, bash – ¿Puede 'buscar' o cualquier otra herramienta buscar archivos en primer lugar?

29

A veces, sé que un archivo no está tan profundo, pero un subdirectorio muy denso no me permite encontrar los archivos que deseo fácilmente.

Poderencontrar (o cualquier otra herramienta) busca archivos usando la búsqueda en primer lugar?

Y dominar la opción "podar" de laencontrar ordena mientras estás en ello. No tiene sentido quedarse atascado en alguna búsqueda recursiva en profundidad de algún subárbol de directorios altamente arraigado y altamente poblado cuando conoce el objeto (archivo o directorio) que está buscando y no está allí. Vietnhi Phuvan
En caso de que todavía estés buscando algo así, escribíesta Tavian Barnes

Tu respuesta

5   la respuesta
0
find . | awk '{FS = "/" ; print "", NF, $F}' | sort -n  | awk '{print $2}' | xargs grep -d skip "search term"

Utiliza find para listar todos los archivos. El primer comando awk cuenta todos los caracteres '/'. Ordena en el recuento y luego suelta la columna de recuento. Finalmente utiliza xargs para grep la lista ordenada de archivos.

Es realmente feo.

4

Utilizarfind con el--maxdepth opción.

Eso es en elDirectorios sección en su página de referencia; Podrías encontrar otras opciones más adecuadas dependiendo de tus necesidades.

Para lograr la amplitud exacta de la primera búsqueda, deberá realizar un bucle con--mindepth y--maxdepth opciones Pero, no creo que sea necesario para ser tan exactos, por lo general una búsqueda limitada en profundidad será suficiente.

17

Sí, una especie de

Puedes usar el-depth Opción para hacer que procese los contenidos de un directorio antes que el propio directorio. También puedes usar el-maxdepth opción para limitar la cantidad de directorios hacia abajo que se perforará.

El "tipo de" es correcto: todavía no es una búsqueda real, ya que a / b / c se visitará antes que a / d. Sin embargo, lo suficientemente bueno para la mayoría de los propósitos. ephemient
Todavía no es la primera búsqueda de amplitud. Eso es sólo la primera búsqueda de profundidad limitada. La primera búsqueda de profundidad limitada resuelve el problema de encontrar "un archivo [que] no está tan profundo", pero no obstante, esta no es la primera búsqueda. yiati
10

Horrible hack, no funciona con-0 o cualquier otra acción que no sea-print, ineficiente, etc. etc ...

#!/bin/bash
i=0
while results=$(find -mindepth $i -maxdepth $i "[email protected]") && [[ -n $results ]]; do
    echo "$results"
    ((i++))
done

Básicamente esto solo corre

find -mindepth 0 -maxdepth 0
find -mindepth 1 -maxdepth 1
find -mindepth 2 -maxdepth 2
…………………………………………………………………………

hastafind devuelve el estado distinto de cero o no imprime nada.

Mini golf:for((i=0;1;i++));do find -mindepth $i -maxdepth $i|grep .||break;done Max Murphy
Tenga en cuenta que si está realizando un procesamiento significativo en cada nodo, la diferencia entre BFS e IDFS para un espacio de búsqueda en particular puede ser significativa. Matt Luongo
@MooingDuck No estaba en desacuerdo con que esto funcionara, solo señalaba que tenía un nombre específico. IDFS también es más lento que BFS, ya que requiere volver a atravesar el nivel anterior en el árbol cada vez. El argumento que he escuchado es que en la mayoría de los problemas de búsqueda, el costo de desplazamiento está dominado por el costo de tiempo de ejecución.n+1, así que a menudo vale la pena. Matt Luongo
@MattLuongo: Desde su enlace: "IDDFS es equivalente a la búsqueda en primer lugar, pero usa mucho menos memoria"; Mooing Duck
5

Una búsqueda de amplitud utilizando variables como su cola.

Crearbfs.sh

#!/bin/bash

queue="$1"
shift

while [ -n "$queue" ]
do
    echo "$queue" | xargs -I'{}' find {} -mindepth 1 -maxdepth 1 $*
    queue=`echo "$queue" | xargs -I'{}' find {} -mindepth 1 -maxdepth 1 -type d`
done

Hazlo ejecutable:

$ chmod u+x ./bfs.sh

Entonces puedes hacer un primer hallazgo por:

$ ./bfs.sh /path/to/somewhere -name foobar

Preguntas relacionadas