1 votes

Recherche de sous-dossiers contenant uniquement des fichiers en double

Je cherche une méthode (sans logiciel payant) pour trouver tous les dossiers qui ne contiennent que des fichiers qui se trouvent également dans au moins un autre sous-dossier du répertoire parent. Utilisée sur une bibliothèque musicale, cette méthode permettrait de répertorier tous les albums de compilation.

Structure du fichier :
Dossier d'artiste
- Dossier d'album
- chansons avec le nom du fichier comme titre

1voto

Ben N Points 38070

Vous pouvez utiliser PowerShell !

$dupes = gi $args[0] | gci -File -Recurse | group Name | ? {$_.Count -gt 1}
gi $args[0] | gci -Directory | ? {
    $allDupes = $true
    $hasAny = $false
    $_ | gci -File | % {
        $folder = $_
        $hasAny = $true
        If (!($dupes | ? {$_.Name -eq $folder.Name})) {$allDupes = $false}
    }
    $allDupes -and $hasAny
}

Ce script est un peu délicat, alors parcourons-le attentivement. Tout d'abord, il prend le dossier spécifié en argument, trouve récursivement les fichiers qu'il contient, les regroupe par nom de fichier, ne prend que les groupes contenant plus d'un élément (c'est-à-dire les groupes qui représentent des chansons dupliquées), et stocke cette collection de groupes dans le dossier $dupes . Ensuite, il récupère à nouveau le répertoire parent spécifié, mais ne liste que les sous-dossiers immédiats. Elle les filtre ( ? ), en laissant seulement ceux qui ne contiennent que des entrées dupliquées sortir du pipeline et être imprimés à l'écran.

Ce gros bloc de filtre occupe la majeure partie du script, alors regardons-le plus en détail. Il commence avec deux variables, l'une pour garder la trace du fait que le dossier actuel de l'album ne contient que des doublons jusqu'à présent, et l'autre pour noter s'il y a réellement des chansons dans le dossier. (Je soupçonne qu'il ne serait pas vraiment utile de compter les dossiers vides comme des albums de compilation). Elle liste les fichiers dans le dossier de l'album, puis pour chacun d'entre eux ( % ), s'assure qu'il existe un groupe en double contenant un fichier de même nom, et si ce n'est pas le cas (c'est-à-dire que rien ne sort du pipeline court à l'intérieur de l'élément If ), indique l'échec en mettant $allDupes à faux. Si le bloc for-each n'a pas été exécuté du tout, alors $hasAny reste faux. Enfin, le grand bloc de filtrage évalue si tous les éléments de l'album sont des doublons et s'il y en a réellement. Le résultat de l'expression détermine si le dossier de l'album sera inclus dans la sortie du pipeline externe.

Notez que certaines des fonctionnalités PowerShell utilisées dans ce script ont été introduites modérément récemment. Si vous utilisez Windows 7, la fonction -File y -Directory Les interrupteurs ne fonctionneront pas. Il est possible de contourner ce problème si nécessaire.

Pour utiliser le script, sauvegardez-le en tant que .ps1 fichier, par exemple albumdupes.ps1 . Si vous ne l'avez pas déjà fait, suivez les instructions de la section Activer les scripts de la page le wiki des balises PowerShell . Vous pouvez ensuite l'exécuter à partir d'une invite PowerShell dans le répertoire où vous l'avez enregistré, en indiquant le chemin d'accès à votre dossier d'artiste :

.\albumdupes.ps1 'C:\Users\Ben\Test\albumtest'

Vous obtiendrez un résultat comme celui-ci :

    Directory: C:\Users\Ben\Test\albumtest

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       11/20/2017   2:00 PM                Album C
d-----       11/20/2017   2:01 PM                Album F

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X