2 votes

trouver un dossier imbriqué dans un dossier

J'ai besoin de trouver un dossier imbriqué dans un dossier.

exemple :

/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 $ 

Prenons deux cas : le dossier externe est à la racine du disque externe et le dossier externe n'est pas à la racine du disque externe. Je devrais être capable de modifier une solution pour l'autre.

J'écris en applescript sur MacOS yosemite ou ultérieur, mais j'invoque potentiellement une commande Unix depuis applescript. La solution peut donc être dans tout applescript ou dans une commande Unix appelée depuis applescript. L'approche de la commande Unix

Voici la commande Unix que j'utilise pour trouver le dossier externe :

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

J'ai essayé une troisième recherche imbriquée, mais je me suis trompé

 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   $

3voto

Michael Zhou Points 167

Je ne suis pas tout à fait sûr de ce que vous recherchez mais ce qui suit donnera la liste de tous les répertoires nommés "Virtual Box" en commençant par le plus profond jusqu'au moins imbriqué.

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

EDIT : OK, en comprenant un peu mieux votre demande, nous pouvons utiliser la fonction path prédicat pour correspondre outerfolder/innerfolder

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

3voto

nohillside Points 82672

En supposant que innerfolder doit se trouver directement dans outerfolder :

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

(formaté pour la lisibilité, vous pouvez aussi tout mettre sur une seule ligne et supprimer la fin de la ligne \ de la première ligne)

0voto

Kerry Jones Points 145

J'applique la solution de fd0 :

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

Vous obtenez les messages ennuyeux "Permission refusée". Vous pourriez envoyer tous les messages d'erreur vers /dev/null, mais c'est trop radical à mon avis.

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   $ 

J'ai combiné la réponse de fd0 avec la méthode d'un poster précédent pour se débarrasser des erreurs de permission.

 { 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

L'inconvénient de l'utilisation de la commande find est qu'elle prend beaucoup de temps si vous incluez le disque de sauvegarde de timemachine.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X