use powershell para seleccionar todos los subdirectorios anidados que contienen y no contienen un archivo específico

use powershell para seleccionar todos los subdirectorios anidados que contienen y no contienen un archivo específico

No puedo devolver una lista de (muchas) carpetas anidadas basadas en condicionales y he probado durante horas muchos métodos diferentes para buscar en línea en documentación y sitios como este.

Estoy probando la siguiente línea:

gci -recur -dir | ? { !(gci $_ -file -recur -filter √.txt) -and (gci $_ -file -recur -filter *.mp3) } | select name

y esperando devolver una lista de carpetas que cumplan las dos condiciones siguientes: contenga al menos un archivo .mp3 como hijo directo, pero no contenga un archivo llamado "√.txt", como hijo directo, es decir:

-music
--artist
---album
----song1.mp3 devolvería solo el nombre del directorio del álbum o la ruta, mientras que:
-music
--artist
---album
----√.txt
----song1. El mp3
se omitiría y se repetiría en unos 10.000 álbumes anidados de diversas formas.

Aún más simple, espero que el siguiente código devuelva una lista de subdirectorios que contienen (como hijos directos) 1 o más archivos .mp3, pero no es así:

gci -recur -dir | ? { (gci $_ -file -recur -filter *.mp3) } | select name

Sólo devuelve los hijos directos (que son carpetas de categorías como "rock" o "jazz") del directorio actual, a pesar de la llamada a -recur.

Lo que me gustaría que sucediera es buscar en una carpeta "música" que tiene miles de subdirectorios anidados y devolver una lista de los subdirectorios (sin importar cuán anidados estén) que contienen simultáneamente (como hijos directos) mp3 pero no contienen "√ .txt" (como hijo directo).

¡Ojalá esto tenga suficiente sentido! Avíseme si necesita más información o claridad.

Aquí hay un fragmento de la estructura de carpetas:

Directorio: D:\music\rock\90s\Stereolab\álbumes:
1992 - Peng!
1992 - Encendido
1994 - Mars Audiac Quintet

¡Gracias!

Respuesta1

No hay forma de hacerlo con un solo comando. Lo que harías es crear una lista de todas las carpetas que contienen al menos un mp3, y luego hacer un segundo bucle solo con esa lista y ver si esa carpeta contiene tu archivo. Si es así, elimine esa entrada de la lista.

Aquí hay un script de ejemplo de lo que es esto:

$targetFolder = "C:\Test"

# Step 1: Scan the target folder and its subfolders for MP3 files
$mp3Files = Get-ChildItem -Path $targetFolder -Filter "*.mp3" -Recurse `
          | Select-Object -ExpandProperty Directory | Get-Unique

# Step 2: Filter the list to exclude folders containing 'v.txt'
$filteredFolders = $mp3Files | Where-Object {
    $vTxtFile = Get-ChildItem -Path $_ -Filter "v.txt" -File `
              -ErrorAction SilentlyContinue
    
    -not $vTxtFile
}

# Step 3: Output the resulting folders
$filteredFolders

información relacionada