2 votos

buscar una carpeta anidada en otra carpeta

Necesito encontrar una carpeta anidada en otra carpeta.

ejemplo:

/Volumes/"4T Virtual Machines"/outerfolder/innerfolder

mac $ pwd
/Volumes/4T Virtual Machines
mac $ ls -lR outerfolder/
total 0
-rw-r--r--  1 mac  staff     0B Aug 28 18:02 file1
-rw-r--r--  1 mac  staff     0B Aug 28 18:02 file2
drwxr-xr-x  5 mac  staff   170B Aug 28 18:04 innerfolder/
drwxr-xr-x  3 mac  staff   102B Aug 28 18:07 otherfolder/

outerfolder//innerfolder:
total 0
-rw-r--r--  1 mac  staff     0B Aug 28 18:04 aaa
-rw-r--r--  1 mac  staff     0B Aug 28 18:04 bbb
-rw-r--r--  1 mac  staff     0B Aug 28 18:04 ccc

outerfolder//otherfolder:
total 0
-rw-r--r--  1 mac  staff     0B Aug 28 18:07 justskip
mac $ 

Tenemos dos casos: la carpeta externa está en root de la unidad externa y la carpeta externa no está en root de la unidad externa. Debería poder modificar una solución por la otra.

Estoy escribiendo en applescript en macOS yosemite o posterior, pero potencialmente invocando un comando Unix desde applescript. Así que la solución puede estar en todo applescript o comando Unix llamado desde applescript. El comando Unix enfoque

Aquí está el comando Unix que tengo para encontrar la carpeta externa:

find /Volumes -type d -maxdepth 1 ! -name Volumes -exec find {} -type d -maxdepth 1 -name "Virtual Box" \; 

He cansado un tercer nested find, pero ha dado error

 find /Volumes -type d -maxdepth 1 ! -name Volumes -exec find {} -type d -maxdepth 1 -name "Virtual Box" -exec find {}  -type d -maxdepth 1 ! -name inner  \;
find: -exec: no terminating ";" or "+"
find: -exec: no terminating ";" or "+"
find: -exec: no terminating ";" or "+"
mac RC=1   $

0 votos

Así que lo que básicamente quieres hacer es encontrar una carpeta innerfolder que está directamente dentro de outerfolder ¿verdad?

0 votos

Sí. Pero no en la unidad de arranque.

0 votos

¿Qué te hace pensar que importa en qué unidad esté? El sistema de ficheros en los sistemas Unix tiene una root común para todos los volúmenes/unidades de disco

3voto

Michael Zhou Puntos 167

No estoy muy seguro de lo que estás buscando, pero lo siguiente listará todos los directorios llamados "Virtual Box" empezando por el más profundo hasta el menos anidado.

find /Volumes -type d ! -name Volumes -name "Virtual Box" 2>/dev/null

EDIT: OK, entendiendo tu requerimiento un poco mejor podemos usar el path predicado para que coincida con outerfolder/innerfolder

find /Volumes -type d -path '*outerfolder/innerfolder'

0 votos

2>/dev/null Supongo que estás tratando de deshacerte de los errores, pero se está deshaciendo de todo.

0 votos

Creo que -name /Volumes y -name Volumes son lo mismo. ¿Cuál es la diferencia si no?

0 votos

@historystamp Bueno, 2>/dev/null está enviando error estándar al cubo de bits y nada más. En realidad, -name Volumes excluirá /Volumes de la salida, mi error, editará

3voto

Suponiendo que innerfolder tiene que estar directamente dentro de outerfolder :

find /Volumes -type d -name "outerfolder" -exec test -d {}/"innerfolder" \; \
                                          -exec echo {}/"innerfolder" \;

(formateado para facilitar la lectura, también puede poner todo en una línea y eliminar el final \ de la primera línea)

0voto

Kerry Puntos 100

Ejecutando la solución de fd0:

find /Volumes -type d -path '*outerfolder/innerfolder'

Aparecen los molestos mensajes de "Permiso denegado". Podrías enviar todos los mensajes de error a /dev/null, pero eso me parece demasiado drástico.

find: /Volumes/4T Virtual Machines/.DocumentRevisions-V100: Permission denied
find: /Volumes/4T Virtual Machines/.TemporaryItems: Permission denied
find: /Volumes/4T Virtual Machines/.Trashes: Permission denied
/Volumes/4T Virtual Machines/outerfolder/innerfolder
/Volumes/4T Virtual Machines/outerfolder/otherfolder/outerfolder/innerfolder
mac RC=1   $ 

Combiné la respuesta de fd0 con la forma de un cartel anterior de deshacerse de los errores de permiso.

 { LC_ALL=C find /Volumes -type d -path '*outerfolder/innerfolder'  3>&2 2>&1 1>&3 | grep --color=auto -v -e 'Permission denied' -e 'Operation not permitted' 1>&3; [ $? = 1 ];  } 3>&2 2>&1

/Volumes/4T Virtual Machines/outerfolder/innerfolder
/Volumes/4T Virtual Machines/outerfolder/otherfolder/outerfolder/innerfolder

El inconveniente de utilizar el comando find es que tarda mucho tiempo si incluye el disco de copia de seguridad de la máquina del tiempo.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X