
La solución a este problema se me ha estado evadiendo durante semanas. Estoy intentando escribir un comando para encontrar solo archivos grabables en todo el mundo en un conjunto específico de directorios sin atravesar ningún subdirectorio usando -prune
.
He intentado una multitud de opciones diferentes sólo para quedarme con
find / -type f -perm -2
Sin embargo, esto todavía atraviesa los subdirectorios. Usando el comando
find / -prune -type f -perm -2
tampoco arroja resultados. ¿En qué me equivoco con esto?
Respuesta1
Intente usar maxdepth N
en su lugar:
-niveles de profundidad máxima
Descienda en la mayoría de los niveles (un número entero no negativo) de directorios por debajo de los puntos de partida. -max Depth 0 significa aplicar solo las pruebas y acciones a los propios puntos de partida.
find $FOLDER -maxdepth 1 -perm -2
Respuesta2
find / -type f -perm -2
Esto es recursivo. Eso es lo que find
hace.
find / -prune -type f -perm -2
Aquí, le indica find
que aplique -prune
a todo lo que encuentre. Las condiciones y acciones se procesan de izquierda a derecha; Como no hay ninguna condición antes -prune
, se aplica incondicionalmente. Entonces, lo primero que find
encuentra, que es el argumento de la línea de comando /
, se -prune
le ha aplicado y, por lo tanto, find
no atraviesa el contenido del directorio. Como /
no cumple con las siguientes condiciones, no se imprime.
Para procesar solo las entradas del directorio de nivel superior, debe aplicar -prune
a los directoriosexcepto los argumentos de la línea de comando. La forma portátil de hacer esto es usarlo /.
al final de la ruta pasada en la línea de comando. Esto hace find
que se trate su nombre como .
, por lo que puedes usarlo -name .
para hacer coincidirlos. En un recorrido recursivo, nunca se llama a ningún archivo .
ya que este nombre está reservado. Ahora hay tres casos diferentes:
- Directorio de nivel superior: recursivo.
- Otro directorio: no recurra.
- Archivo normal en el que se puede escribir en todo el mundo: imprimir.
Para especificar varios comportamientos diferentes, utilice el -o
operador (“o”). Se aplica el primero para el que coinciden todas las condiciones.
find /. -name . -o -type d -prune -o -type f -perm -2 -print
Algunas versiones de find
permiten escribir find / -name / -o -type d -prune -o …
pero otras no (por ejemplo, BusyBox).
Algunas versiones find
admiten opciones -mindepth
y -maxdepth
limitan el recorrido recursivo. Si su búsqueda lo admite, puede usar esto en lugar de -prune
.
find / -mindepth 1 -maxdepth 1 -type f -perm -2
( -mindepth
y -maxdepth
son opciones globales, la parte de condiciones y acciones tiene -type f -perm -2
el final implícito -print
).