Le système Windows trouve des fichiers en double dans plusieurs dossiers

Table des matières

La méthode de saisie directe des commandes dans le terminal PowerShell

Le résultat est brut

La sortie est terminée

Comment écrire et exécuter des fichiers .ps1

Sortie de classification

Rechercher par nom de fichier, longueur et extension

Rechercher par valeur MD5

écrire le résultat dans un fichier

Explication du code (pas important, il est recommandé de sauter)

signaler une erreur

Résumer 


Utilisez l'outil PowerShell pour rechercher les fichiers en double dans plusieurs dossiers. Différentes commandes et leurs effets sont affichés, et la méthode correspondante est sélectionnée en fonction de l'effet souhaité.

Ce qui précède est la méthode du produit fini, sélectionnez le code en fonction de l'effet, et le code peut être copié et utilisé.

Résumé final et explication du code, le code peut être ajusté selon les besoins.

La méthode de saisie directe des commandes dans le terminal PowerShell

Le résultat est brut

Ouvrez le terminal PowerShell et entrez directement

Get-ChildItem -Chemin C:\222, D:\111 -Recurse | Groupe-Objet -Nom de la propriété | Où-Objet { $_.Count -gt 1 }

 -Paramètre de chemin "C:\222, D:\111" modifiez le dossier que vous devez rechercher en fonction de vos propres besoins.

Le résultat est affiché sur l'interface du terminal et l'effet de sortie est :

Groupe de noms de nombre
----- ---- -----
    4 1.docx {1.docx, 1.docx, 1.docx, 1.docx}
    3 1.pptx {1.pptx, 1.pptx , 1.pptx}

Le chemin peut être remplacé par un chemin chinois, c'est-à-dire que des chemins tels que « C:\222 » peuvent contenir des caractères chinois.

La sortie est terminée

Ouvrez le terminal PowerShell et entrez directement

 Get-ChildItem -Chemin C:\222, D:\111 -Recurse | Groupe-Objet -Nom de la propriété | Où-Objet { $_.Count -gt 1 }| Groupe Select-Object -ExpandProperty | Sélectionner l'objet FullName, Longueur, CreationTime, LastWriteTime

 -Paramètre de chemin "C:\222, D:\111" modifiez le dossier que vous devez rechercher en fonction de vos propres besoins.

Le résultat est affiché sur l'interface du terminal et l'effet de sortie est :

FullName Longueur CreationTime LastWriteTime
-------- ------ ------------ -------------
C:\222\1. docx 12175 15/05/2023 19:01:13 15/05/2023 16:41:39
D:\111\1.docx 12175 15/05/2023 16:39:09 15/05/2023 16:41 : 39
D:\111\Nouveau dossier\1.docx 0 2023/5/15 16:39:44 2023/5/15 16:39:09
D:\111\Nouveau dossier\Nouveau dossier (2)\ 1.docx 0 15/05/2023 16:39:53 15/05/2023 16:39:09
C:\222\1.pptx 0 15/05/2023 19:01:13 15/05/2023 16 : 39:37
D:\111\1.pptx 0 15/05/2023 16:39:37 15/05/2023 16:39:37
D:\111\Nouveau dossier\1.pptx 0 15/05/2023 16:39 : 44 2023/05/15 16:39:37

Comment écrire et exécuter des fichiers .ps1

La méthode d'écriture et d'exécution des fichiers .ps1 peut produire des effets complexes.

Sortie de classification

Recherchez dans les deux dossiers C:\222 et D:\111 :

Créez un nouveau document texte et saisissez le contenu suivant :

$folderspath = "C:\222", "D:\111"
$files = Get-ChildItem -Path $folderspath -Recurse | Where-Object { !$_.PSIsContainer }
$groups = $files | Group-Object -Property Name | Where-Object { $_.Count -gt 1 }

foreach ($group in $groups) {
    $group.Group | Select-Object FullName, Length, CreationTime | Sort-Object FullName | Format-Table -AutoSize
}

$folderspath = "C:\222", "D:\111" est modifié selon la situation.

Enregistrez sous forme de fichier avec le suffixe « .ps1 », tel que « 111.ps1 ». Entrez ".\111.ps1" dans PowerShell pour exécuter le fichier.

Effet:

 .\12.ps1

Longueur du nom complet CreationTime
-------- ------ ------------
C:\222\1.docx 12175 2023/5/15 17:28:00
D : \111\1.docx 12175 15/05/2023 16:39:09
D:\111\Nouveau dossier\1.docx 0 15/05/2023 16:39:44
D:\111\Nouveau dossier\Nouveau dossier ( 2)\1.docx 0 15/05/2023 16:39:53

Longueur du nom complet CreationTime
-------- ------ ------------
C:\222\1.pptx 0 2023/5/15 17:23:57
D : \111\1.pptx 0 15/05/2023 16:39:37
D:\111\Nouveau dossier\1.pptx 0 15/05/2023 16:39:44

Rechercher par nom de fichier, longueur et extension

Modifiez le paramètre "Group-Object -Property" et définissez-le sur ce que vous voulez :

$folderspath = "C:\222", "D:\111"
$files = Get-ChildItem -Path $folderspath -Recurse | Where-Object { !$_.PSIsContainer }
$groups = $files | Group-Object -Property  Length, Name, Extension | Where-Object { $_.Count -gt 1 }

foreach ($group in $groups) {
    $group.Group | Select-Object FullName, Length, CreationTime | Sort-Object FullName | Format-Table -AutoSize
}

Effet

Longueur du nom complet CreationTime
-------- ------ ------------
C:\222\1.docx 12175 2023/5/15 19:01:13
D : \111\1.docx 12175 15/05/2023 16:39:09

Longueur du nom complet CreationTime
-------- ------ ------------
C:\222\1.pptx 0 2023/5/15 19:01:13
D : \111\1.pptx 0 15/05/2023 16:39:37
D:\111\Nouveau dossier\1.pptx 0 15/05/2023 16:39:44

Rechercher par valeur MD5

Rechercher le même fichier en fonction de la valeur MD5 du fichier

$folderspath = "C:\222", "D:\111"
$files = Get-ChildItem -Path $folderspath -Recurse | Where-Object { !$_.PSIsContainer }
$md5s = $files | ForEach-Object { Get-FileHash $_.FullName | Select-Object -ExpandProperty Hash }
$groups = $files | Group-Object -Property @{ Expression={$md5s[$files.IndexOf($_)]} } | Where-Object { $_.Count -gt 1 }
foreach ($group in $groups) {
    Write-Output "以下是 MD5 值为 $($group.Name) 的文件:"
    foreach ($item in $group.Group) {
        Write-Output $item.FullName
    }
    Write-Output "---------------------------------------------------------------`n"
}

Ce code est d'abord utilisé pour Get-ChildItemobtenir tous les fichiers sous le chemin spécifié, puis utilisé Get-FileHashpour calculer la valeur MD5 de chaque fichier et l'enregistrer dans $md5sla variable.

Ensuite, utilisez pour Group-Objectregrouper par valeur MD5 et filtrez les groupes dont le nombre de fichiers dans le groupe est supérieur à 1. Enfin, foreachparcourez chaque groupe en utilisant pour afficher le chemin complet et le nom de fichier des fichiers de ce groupe, avec une ligne vide entre chaque groupe.

Effet de sortie :

Voici le fichier avec la valeur MD5 23C2732778B8A5BFAD00AEA036D8F614430822C40E69A511E1E7AA5F4535B753 :
C:\222\1.docx
D:\111\1.docx
------------------------- -----------------------------------------

Voici le fichier dont la valeur MD5 est E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855 :
C:\222\1.pptx
C:\222
\1.txt D:\111\1.pptx
D:\111\1.txt
D:\ 111\New Dossier \ 1.pptx
D:\111\Nouveau dossier\Nouveau dossier (2)\1.docx
---------------------------- - ----------------------------------

On peut voir que les fichiers se révèlent être le même fichier selon la valeur MD5.

L'auteur a découvert grâce à des expériences que les fichiers copiés à partir du même fichier ont la même valeur MD5 et seront considérés comme des fichiers en double. Et si le fichier copié est modifié, sa valeur MD5 change et il n'est plus considéré comme un fichier en double.

De plus, les valeurs MD5 des fichiers vides sont les mêmes. Par exemple, les six derniers fichiers de l'exemple ci-dessus sont tous des fichiers vides et sont considérés comme des fichiers en double.

MD5 (Message Digest Algorithm 5) est une fonction de hachage unidirectionnelle couramment utilisée, également connue sous le nom d'algorithme de résumé de message. Il calcule un « message » de longueur arbitraire (comme le contenu d'un fichier ou un flux de données) sous la forme d'une empreinte numérique de longueur fixe, généralement un nombre binaire de 128 bits (16 octets).

L'algorithme MD5 est largement utilisé dans des domaines tels que l'intégrité vérifiable des données et les signatures chiffrées. Les applications courantes incluent la cryptographie, les certificats numériques, les sommes de contrôle de fichiers, la transmission sécurisée, etc. En comparant les valeurs MD5 de deux fichiers, on peut juger si leur contenu est totalement cohérent. S'ils sont différents, cela signifie que les fichiers ont été falsifiés ou endommagés.

Il convient de noter qu'en raison de la vulnérabilité aux collisions dans l'algorithme MD5, deux messages différents peuvent être construits, mais leurs valeurs MD5 sont les mêmes. Ainsi, avec l'amélioration de la puissance de calcul, l'algorithme MD5 a été progressivement remplacé par des algorithmes plus sécurisés, tels que SHA-256, SHA-3, etc.

Un fichier vide a une valeur MD5 différente de celle d'un fichier non vide. L'algorithme MD5 est un algorithme qui prend le contenu du fichier en entrée et génère une valeur de hachage de 128 bits en sortie. Par conséquent, différents facteurs tels que la taille du fichier, le type de fichier et le nom du fichier affecteront le résultat du calcul de la valeur MD5.

Cependant, pour plusieurs fichiers vides, leurs valeurs MD5 sont égales. En effet, le contenu des fichiers vides est identique, sans un seul octet. Par conséquent, leurs résultats de calcul MD5 sont également les mêmes.

écrire le résultat dans un fichier

Le résultat est trop long pour être lu d’un coup, vous pouvez donc l’enregistrer dans un fichier texte et le lire plus tard.

La méthode de sauvegarde consiste à utiliser "$output" pour sauvegarder.

$OutputEncoding = [Console]::OutputEncoding = [System.Text.Encoding]::UTF8
$folderspath = "C:\222", "D:\111"
$files = Get-ChildItem -Path $folderspath -Recurse  | Group-Object -Property Length,Name | Where-Object { $_.Count -gt 1 }
foreach ($file in $files) {
    $output = "Duplicate file name: $($file.Name)`r`n"
    foreach ($item in $file.Group) {
        $output += "`tPath+File Name: $($item.FullName)`r`n"
    }
    $output += ('-'*80) + "`r`n"
    $output | Out-File -FilePath .\11.txt -Append -Encoding UTF8
}

Le résultat de la sortie est enregistré dans .\11.txt, le contenu du fichier :

Nom du fichier en double : 12175, 1.docx
    Chemin+Nom du fichier : C:\222\1.docx
    Chemin+Nom du fichier : D:\111\1.docx
--------------- -------------------------------------------------- ---------------

Nom du fichier en double : 0, 1.pptx
    Chemin+Nom du fichier : C:\222\1.pptx
    Chemin+Nom du fichier : D:\111\1.pptx
    Chemin+Nom du fichier : D:\111\Nouveau dossier\1 . pptx
------------------------------------------------ - -------------------------------

Construisez d’abord la variable $output, puis affichez $output dans le fichier.

Explication du code (pas important, il est recommandé de sauter)

L'explication du code pertinent donnée par GPT :

Ok, voici ce que signifie chaque paramètre :

```powershell
$files = Get-ChildItem -Path "C:\votre\dossier" -Recurse | Où-Object { !$_.PSIsContainer }
```

- `Get-ChildItem` : Obtenez une liste des fichiers et sous-répertoires dans le répertoire spécifié.
- `-Path "C:\your\folder"` : Spécifiez le chemin du dossier à rechercher. Peut être remplacé entre guillemets par le chemin complet du dossier que vous souhaitez rechercher.
- `-Recurse` : renvoie de manière récursive tous les fichiers et dossiers de la hiérarchie des dossiers.
- `Where-Object { !$_.PSIsContainer }` : utilisez des conditions pour filtrer les objets qui ne sont pas des dossiers. Vous pouvez le considérer comme un filtre qui renvoie uniquement les éléments qui ne sont pas des dossiers.

```powershell
$md5s = $fichiers | ForEach-Object { Get-FileHash $_.FullName | Select-Object -ExpandProperty Hash }
```

- `$files` : Une liste de tous les objets fichiers précédemment filtrés du dossier.
- `ForEach-Object` : Pour chaque élément de la liste `$files`, effectuez les opérations suivantes.
- `Get-FileHash` : calcule la valeur de hachage du fichier spécifié. Ici, nous utilisons l'algorithme de hachage MD5 pour calculer la valeur de hachage de chaque fichier.
- `Select-Object` : Sélectionnez les propriétés ou d'autres données d'un objet transmis via le pipeline. Ici, nous n'avons besoin que de la valeur de hachage.
- `-ExpandProperty Hash` : développez l'attribut de valeur de hachage, ce qui est pratique pour un regroupement ultérieur.

```powershell
$fichiers | Groupe-Objet -Property @{ Expression={$md5s[$files.IndexOf($_)]} } | Où-Objet { $_.Count -gt 1 }
```

- `$files` : Une liste de tous les objets fichiers précédemment filtrés du dossier.
- `Group-Object` : regroupe les objets d'entrée par valeurs d'attribut spécifiées.
- `-Property @{ Expression={$md5s[$files.IndexOf($_)]} }` : Spécifie le nom de la propriété à utiliser pour le regroupement. L'expression `@{ Expression={$md5s[$files.IndexOf($_)]} }` effectuera un calcul d'index sur chaque élément de la liste `$files` pour obtenir sa valeur de hachage.
- `Where-Object { $_.Count -gt 1 }` : filtre les groupes de fichiers en double. Seuls les groupes dont le nombre d'éléments est supérieur à 1 seront conservés.

```powershell
foreach ($groupe dans $groups) {     $group.Group | Sélectionnez l'objet FullName, Longueur, CreationTime | Nom complet de l'objet de tri | Format-Table -AutoSize } ```


- `foreach` : Pour chaque élément de la liste `$groups`, effectuez les opérations suivantes.
- `$group` : l'objet de regroupement dans l'itération de boucle en cours.
- `$group.Group` : liste des fichiers en double dans l'objet groupe pour l'itération de boucle en cours.
- `Select-Object FullName, Length, CreationTime` : sélectionnez les propriétés du fichier à afficher sur la console. Ici, nous choisissons le chemin complet, la taille et l'heure de création du fichier de sortie.
- `Sort-Object FullName` : Trie la sortie par ordre alphabétique par nom de fichier.
- `Format-Table -AutoSize` : formatez les résultats de sortie et ajustez automatiquement la largeur de la colonne à une taille appropriée.

`Where-Object { !$_.PSIsContainer }` est un filtre après le symbole pipe `|` dans PowerShell, qui est utilisé pour filtrer les éléments qui ne sont pas des répertoires (dossiers) des résultats de sortie.

Ici, la commande `Get-ChildItem -Path "D:\111" -Recurse` est utilisée pour obtenir tous les éléments enfants sous le chemin spécifié, y compris les fichiers et les dossiers. Utilisez le filtre `Where-Object` pour filtrer les sous-éléments, où `$_.PSIsContainer` est une propriété booléenne, si elle est `$true`, cela signifie que l'élément est un répertoire, sinon c'est un fichier. Par conséquent, l'expression `!$_.PSIsContainer` signifie que l'élément qui est `$true` après la négation est un élément non-répertoire (fichier), c'est-à-dire que seul le sous-élément du type de fichier est réservé.

Le but de ceci est de faire en sorte que la variable `$files` contienne uniquement les informations de fichier dans le répertoire spécifié, ce qui est pratique pour le calcul ultérieur des valeurs MD5 et le regroupement par valeur.

J'espère que cela vous permettra de mieux comprendre le code !

signaler une erreur

Pour les commandes d'exécution PowerShell, les erreurs courantes et la gestion, veuillez vous référer à :

Erreur courante et gestion de la commande d'exécution de PowerShell du système Windows - Blog de Weixin_56337147 - Blog CSDN 

Résumer 

La méthode de saisie directe des instructions sur le terminal PowerShell convient aux instructions sur une seule ligne et l'opération est relativement simple. Les méthodes d'écriture et d'exécution des fichiers .ps1 peuvent produire des effets complexes, mais les codes des deux ont la même signification. La signification de chaque code est la suivante :

Get-ChildItem -Path $folderspath -Recurse : récupère les fichiers dans le chemin $folderspath, le paramètre -Recurse est utilisé pour renvoyer de manière récursive tous les fichiers et dossiers de la hiérarchie des dossiers.

Where-Object { !$_.PSIsContainer } : filtre les éléments qui ne sont pas des dossiers. Si cette étape existe, il s'agit de rechercher les fichiers en double. Si cette étape n'existe pas, il recherchera à la fois les fichiers et les dossiers en double.

 Group-Object -Property Name : regroupez les fichiers obtenus selon "Nom", et la norme de regroupement "Nom" peut être remplacée par d'autres, comme le regroupement selon le nom, la longueur et l'extension peut être définie sur "Longueur, Nom, Extension". Vérifier le poids, c'est mieux.

Where-Object { $_.Count -gt 1 } : filtre les groupes de fichiers en double. "$_.Count -gt 1" signifie que seuls les groupes comportant des éléments dont le nombre est supérieur à 1 seront conservés. "gt" signifie "supérieur à". Si vous souhaitez répéter le groupe avec un nombre de fichiers supérieur à 2, définissez-le sur " $_.Count -gt 2".

foreach ($file in $files) { : Pour chaque élément de la liste `$files`, effectuez les opérations suivantes.

$output | Out-File -FilePath .\11.txt -Append -Encoding UTF8 : fichier de sortie Out-File, affiche la variable "$output" précédemment construite, le chemin du fichier " -FilePath .\11.txt " est . \11.txt, la méthode de sauvegarde est "-Append" et le format de texte est "-Encoding UTF8".

Guess you like

Origin blog.csdn.net/weixin_56337147/article/details/130690542