J'ai besoin d'obtenir le contenu entier (visible) d'un dossier et de ses sous-dossiers sous forme de liste. Est-ce possible?

10
Alexsander Akers 20 janv. 2010 à 00:32

3 réponses

Meilleure réponse

Je suis sûr qu'il existe une commande shell qui peut le faire plus rapidement, mais voici un moyen en pur Applescript qui vous donne un contrôle total sur le formatage des informations que vous souhaitez afficher.

property kFileList : {}

tell application "Finder"
    set source_folder to choose folder with prompt "Please select directory."
    my createList(source_folder)
end tell

on createList(item_list)
    set the the_items to list folder item_list without invisibles
    set item_list to item_list as string
    repeat with i from 1 to number of items in the the_items
        set the_item to item i of the the_items
        set the_item to (item_list & the_item) as alias
        set this_info to info for the_item
        set file_name to name of this_info
        set end of kFileList to file_name
        if folder of this_info is true then
            my createList(the_item)
        end if
    end repeat
end createList

En passant, il existe également un certain nombre d'applications de liste de fichiers qui peuvent le faire plus rapidement qu'Applescript.

MISE À JOUR : À la suite de cette discussion, voici à nouveau la fonction, mais cette fois en utilisant l'API mise à jour. Cela pourrait probablement nécessiter un peu de nettoyage, mais cela fonctionne en cataloguant mon bureau assez facilement (et c'est un dossier profond et profond pour moi):

property kFileList : {}

tell application "Finder"
    set source_folder to choose folder with prompt "Please select directory."
    my createList(source_folder)
end tell

return kFileList

on createList(mSource_folder)
    set item_list to ""

    tell application "System Events"
        set item_list to get the name of every disk item of mSource_folder
    end tell

    set item_count to (get count of items in item_list)

    repeat with i from 1 to item_count
        set the_properties to ""

        set the_item to item i of the item_list
        set the_item to ((mSource_folder & the_item) as string) as alias

        tell application "System Events"
            set file_info to get info for the_item
        end tell

        if visible of file_info is true then
            set file_name to displayed name of file_info
            set end of kFileList to file_name
            if folder of file_info is true then
                my createList(the_item)
            end if
        end if

    end repeat
end createList

Je dois être abonné aux mauvaises listes de diffusion ou en manquer une car ces modifications de l'API ont été adoptées et je n'en ai jamais entendu parler. J'ai utilisé ma première méthode proposée dans des dizaines de projets en grande partie parce qu'il s'agissait du code proposé à l'origine par Apple, et l'absence totale d'erreurs lors de son utilisation (même au moment d'écrire ces lignes) n'a jamais déclenché pour moi le besoin de mettre à jour quoi que ce soit. .

Le revirement est fair-play, et mes excuses pour le vote négatif malveillant à mmcgrail, et je le remplace par un vote positif. Juste pour être clair, je n'ai jamais pensé que la réponse donnée par mmcgrail était fausse. C'est une excellente méthode de commodité en une ligne, mais je suis restée à l'écart d'après mes commentaires déjà donnés. Mais c'est plutôt son vote négatif et son contexte déclaré qui m'offusquent. En fin de compte, ce n'est que du code, et je pense que nous sommes tous ici pour la même raison : trouver une meilleure façon de faire ce que nous faisons. Il semble que j'ai maintenant quelques mises à jour à mettre en œuvre.

À votre santé

8
Philip Regan 1 avril 2010 à 21:33
Il écrit quelque chose comme "Impossible d'obtenir tous les éléments du disque de ..."
 – 
user2159978
18 févr. 2014 à 14:22

C'est beaucoup plus de travail que nécessaire. Je sais que c'est un vieux post mais je veux que vous voyiez tous les deux à quel point cela peut être facile

  tell application "Finder"
     set file_list to entire contents of (choose folder with prompt "Please select directory.")
   end tell 

Si vous voulez une liste de noms de fichiers, vous pouvez le faire

  tell application "Finder"
    set file_list to name of every file of entire contents of (choose folder with prompt "Please select directory.")
   end tell

En raison des commentaires qui suivent cet article, j'ai demandé à un groupe d'experts en affaires d'examiner cette question et d'évaluer notre réponse de manière impartiale et la réponse que j'ai obtenue était la suivante.

"Que diriez-vous d'une vérole sur vos deux maisons ? :-)

Oui, tout le contenu fait exactement ce que vous dites - mais cela s'étouffe facilement avec des dossiers volumineux et prend une éternité (et un jour si vous êtes sur 10.6). C'est OK pour les petites choses, comme extraire tous les fichiers d'un même type d'un dossier dont vous savez qu'il ne contiendra qu'un petit nombre de fichiers.

La méthode récursive fonctionne également bien - mais elle utilise le "dossier de liste", et la liste du dictionnaire indique qu'elle est obsolète et que nous ne devrions plus l'utiliser."

Alors j'entends par déclarer que j'avais tort ! ces deux solutions sont valables mais ont une "vérole" ou des trous dans leurs utilisations. Mes excuses à Philippe. S'il décide de modifier sa réponse (parce que c'est le seul moyen de changer mon vote), je serai heureux de revenir et de lui donner +1

12
mcgrailm 1 avril 2010 à 16:19
Exact, car une liste massive de {fichier de document "FileName" du dossier "SubFolder" du dossier "Folder" du dossier "username" du dossier "Users" du disque de démarrage de l'application "Finder", ad nauseum} et devant traiter par la suite qui est tellement plus utile que d'exiger un vote négatif sur le mien.
 – 
Philip Regan
31 mars 2010 à 22:43
Qu'est-ce qu'il y a à traiter vous avez la liste et votre référence les éléments au besoin, c'est-à-dire l'alias de l'élément dans la liste des fichiers, vous faites beaucoup plus de travail que nécessaire, c'est pourquoi je vous ai donné un vote négatif, je ne vous l'ai pas donné par dépit où comme cela semble être ce que vous faites
 – 
mcgrailm
31 mars 2010 à 22:51
De plus, votre kFileList renvoie une liste de noms de fichiers uniquement et aucune référence à l'origine du fichier.
 – 
mcgrailm
31 mars 2010 à 22:59
Il s'agit d'un scénario « six sur un, demi-douzaine sur l'autre ». En obtenant les propriétés des informations du fichier à l'avance, il est facile de créer une liste personnalisée dès le départ, au lieu d'obtenir la liste des alias, puis d'extraire les informations souhaitées après coup. Moins de lignes de code n'est pas toujours la meilleure réponse, ni la pire réponse. Veuillez réfléchir à deux fois avant de voter contre.
 – 
Philip Regan
31 mars 2010 à 23:15
Vote négatif : Oui. Oui je l'ai fait. Le vôtre était aussi inutile que le mien selon mon point ci-dessus. Je vote rarement contre (six fois en un an y compris ici alors que vous semblez être sur une lancée à 5 en 3 mois). Je ne vote que pour les erreurs vraiment flagrantes dans les réponses, mais vous semblez m'avoir surpris un jour grincheux. La prochaine fois, encore une fois, réfléchissez-y à deux fois avant de voter contre et de sacrifier des points précieux juste pour « vouloir nous montrer à tous les deux à quel point c'est facile ». Si vous n'aimez tout simplement pas une réponse, laissez-la tranquille.
 – 
Philip Regan
31 mars 2010 à 23:17

Wow c'est assez tard mais j'ai vérifié et ça marche.

tell application "Finder" to set folder_root to (choose folder with prompt "Please select directory.")

set fl to {}
dump_folder(folder_root)

on dump_folder(f)
    global fl
    tell application "System Events" to set end of fl to (get the POSIX path of f)
    tell application "Finder" to set nfl to (the items of the contents of f)
    repeat with nf in nfl
        dump_folder(nf as alias)
    end repeat
end dump_folder

fl
1
梁國淦 27 déc. 2017 à 19:07