PowerShell Training · Topic 5

Detectar duplicados por nombre

Un ejercicio práctico para comparar dos carpetas, o una misma carpeta, e identificar archivos repetidos de forma rápida y simple.

Detect duplicates by name

A hands-on exercise to compare two folders, or one folder, and quickly identify repeated files by name.

⚠️ Advertencia crítica antes de correr cualquier script

No ejecutes este tipo de script en un ambiente de producción, carpeta real, servidor compartido, unidad de red o sistema institucional sin autorización formal.

PowerShell es una herramienta poderosa: un comando de renombrado masivo puede modificar cientos o miles de archivos en segundos. En una carpeta equivocada, eso puede causar pérdida de trazabilidad, fallos en procesos automáticos, interrupciones operativas o incidentes de ciberseguridad.

Regla obligatoria del training: primero se trabaja con data sintética, luego se valida con una muestra pequeña, después se prueba con -WhatIf cuando aplique, y solo entonces se considera ejecutar en datos reales siguiendo los protocolos de la organización.

  • Permisos: usa solamente carpetas donde tengas autorización explícita.
  • Backups: confirma que exista copia de seguridad o posibilidad real de recuperación.
  • Cybersecurity: cumple las políticas internas, controles de acceso, change management y principios de menor privilegio.
  • Producción: nunca ejecutes scripts masivos directamente sobre producción sin revisión, aprobación y plan de reversa.

⚠️ Critical warning before running any script

Do not run this type of script in a production environment, real folder, shared server, network drive, or institutional system without formal authorization.

PowerShell is a powerful tool: a bulk command can modify hundreds or thousands of files in seconds. In the wrong folder, it can break traceability, disrupt automated processes, create operational issues, or trigger cybersecurity incidents.

Mandatory training rule: start with synthetic data, validate with a small sample, test with -WhatIf when applicable, and only then consider real data while following your organization’s protocols.

  • Permissions: use only folders where you have explicit authorization.
  • Backups: confirm that a backup or real recovery option exists.
  • Cybersecurity: follow internal policies, access controls, change management, and least-privilege principles.
  • Production: never run bulk scripts directly on production without review, approval, and rollback planning.

Objetivo del Topic 5

El objetivo es detectar archivos que existen en dos carpetas diferentes usando solamente el nombre del archivo. Esto ayuda a identificar duplicados antes de copiar, mover, limpiar o consolidar información.

01 · Crear carpetas
02 · Comparar nombres
03 · Verificar duplicados
Idea central: Compare-Object permite comparar dos listas. Cuando usamos -IncludeEqual, también muestra los elementos que aparecen en ambos lados.

Topic 5 Objective

The goal is to detect files that exist in two different folders using only the file name. This helps identify duplicates before copying, moving, cleaning, or consolidating information.

01 · Create folders
02 · Compare names
03 · Verify duplicates
Core idea: Compare-Object compares two lists. When we use -IncludeEqual, it also shows the items that appear on both sides.

Ruta de trabajo

Todo se ejecuta dentro de una carpeta controlada:

Working folder

Everything runs inside a controlled folder:

$BasePath = "$env:USERPROFILE\Documents\AI Practical Training\PowerShell\Topic 5"

Qué vamos a aprender

  • Crear dos carpetas de práctica.
  • Generar archivos únicos y archivos repetidos.
  • Comparar nombres usando Compare-Object.
  • Filtrar solo duplicados con SideIndicator -eq "==".
  • Exportar un reporte simple a CSV.

What you will learn

  • Create two practice folders.
  • Generate unique and repeated files.
  • Compare names using Compare-Object.
  • Filter only duplicates with SideIndicator -eq "==".
  • Export a simple report to CSV.
01

Script 1 — Crear data sintética en dos carpetas

Este script crea dos carpetas de práctica con algunos archivos repetidos y otros únicos. Así podemos probar la comparación sin tocar data real.

Script 1 — Create synthetic data in two folders

This script creates two practice folders with some repeated files and some unique files. This allows us to test the comparison without touching real data.

# ======================================================
# Topic 5 - Script 1
# Create synthetic folders and duplicate file names
# ======================================================

$BasePath = "$env:USERPROFILE\Documents\AI Practical Training\PowerShell\Topic 5"
$Folder1  = Join-Path $BasePath "Folder_A"
$Folder2  = Join-Path $BasePath "Folder_B"

New-Item -Path $Folder1, $Folder2 -ItemType Directory -Force | Out-Null

# Files in Folder A
$FilesA = @(
    "10001.jpg",
    "10002.jpg",
    "10003.jpg",
    "10004.jpg",
    "10005.jpg",
    "Only_In_A_9001.jpg",
    "Only_In_A_9002.jpg"
)

# Files in Folder B
$FilesB = @(
    "10003.jpg",
    "10004.jpg",
    "10005.jpg",
    "10006.jpg",
    "10007.jpg",
    "Only_In_B_8001.jpg",
    "Only_In_B_8002.jpg"
)

foreach ($File in $FilesA) {
    New-Item -Path (Join-Path $Folder1 $File) -ItemType File -Force | Out-Null
}

foreach ($File in $FilesB) {
    New-Item -Path (Join-Path $Folder2 $File) -ItemType File -Force | Out-Null
}

Write-Host "Synthetic data created in:" $BasePath
Write-Host "Folder A:"
Get-ChildItem $Folder1 | Select-Object Name
Write-Host ""
Write-Host "Folder B:"
Get-ChildItem $Folder2 | Select-Object Name
02

Script 2 — Detectar duplicados por nombre

Este script toma los nombres de los archivos en ambas carpetas, compara las listas y muestra solamente los nombres que existen en los dos lugares.

Script 2 — Detect duplicates by name

This script takes the file names from both folders, compares the lists, and shows only the names that exist in both locations.

# ======================================================
# Topic 5 - Script 2
# Detect duplicate file names across two folders
# ======================================================

$BasePath = "$env:USERPROFILE\Documents\AI Practical Training\PowerShell\Topic 5"
$Folder1  = Join-Path $BasePath "Folder_A"
$Folder2  = Join-Path $BasePath "Folder_B"

$Folder1Names = Get-ChildItem $Folder1 -File | Select-Object -ExpandProperty Name
$Folder2Names = Get-ChildItem $Folder2 -File | Select-Object -ExpandProperty Name

Compare-Object $Folder1Names $Folder2Names -IncludeEqual |
Where-Object { $_.SideIndicator -eq "==" } |
Select-Object @{Name="Duplicate_File_Name"; Expression={$_.InputObject}}
Nota: este script no borra, no mueve y no renombra. Solo reporta duplicados por nombre. Es una acción segura para diagnóstico.
Note: this script does not delete, move, or rename. It only reports duplicates by name. It is a safe diagnostic action.
03

Script 3 — Generar reporte de duplicados

Este script crea un CSV con los duplicados encontrados para que el resultado pueda revisarse, compartirse o documentarse.

Script 3 — Generate duplicate report

This script creates a CSV file with the duplicates found so the result can be reviewed, shared, or documented.

# ======================================================
# Topic 5 - Script 3
# Export duplicate file name report
# ======================================================

$BasePath   = "$env:USERPROFILE\Documents\AI Practical Training\PowerShell\Topic 5"
$Folder1    = Join-Path $BasePath "Folder_A"
$Folder2    = Join-Path $BasePath "Folder_B"
$ReportPath = Join-Path $BasePath "Duplicate_File_Names_Report.csv"

$Folder1Names = Get-ChildItem $Folder1 -File | Select-Object -ExpandProperty Name
$Folder2Names = Get-ChildItem $Folder2 -File | Select-Object -ExpandProperty Name

$Duplicates = Compare-Object $Folder1Names $Folder2Names -IncludeEqual |
Where-Object { $_.SideIndicator -eq "==" } |
ForEach-Object {
    [PSCustomObject]@{
        Duplicate_File_Name = $_.InputObject
        Folder_A_Path       = Join-Path $Folder1 $_.InputObject
        Folder_B_Path       = Join-Path $Folder2 $_.InputObject
    }
}

$Duplicates | Export-Csv -Path $ReportPath -NoTypeInformation

Write-Host "Duplicate report created:"
Write-Host $ReportPath

$Duplicates

Explicación simple del script

  • Get-ChildItem obtiene los archivos de cada carpeta.
  • Select-Object -ExpandProperty Name extrae solamente el nombre.
  • Compare-Object compara la lista A contra la lista B.
  • -IncludeEqual permite ver los elementos iguales.
  • SideIndicator -eq "==" deja solo los duplicados.

Simple script explanation

  • Get-ChildItem gets the files from each folder.
  • Select-Object -ExpandProperty Name extracts only the name.
  • Compare-Object compares list A against list B.
  • -IncludeEqual allows equal items to be shown.
  • SideIndicator -eq "==" keeps only duplicates.

Ejemplo esperado

DuplicadoExiste en
10003.jpgFolder_A y Folder_B
10004.jpgFolder_A y Folder_B
10005.jpgFolder_A y Folder_B

Expected example

DuplicateExists in
10003.jpgFolder_A and Folder_B
10004.jpgFolder_A and Folder_B
10005.jpgFolder_A and Folder_B

Conclusión

Este topic enseña una forma rápida y simple de detectar duplicados por nombre antes de tomar acciones más fuertes. Es ideal para revisar carpetas de fotos, documentos, escaneos, cargas masivas o archivos exportados desde sistemas diferentes.

Lección clave: detectar duplicados no significa borrarlos. Primero se reportan, se validan y luego se decide qué acción corresponde según las reglas del proceso.

Conclusion

This topic teaches a fast and simple way to detect duplicates by name before taking stronger actions. It is ideal for reviewing folders of photos, documents, scans, bulk uploads, or files exported from different systems.

Key lesson: detecting duplicates does not mean deleting them. First we report them, validate them, and then decide the proper action based on the process rules.