powershell을 사용하여 특정 파일을 포함하거나 포함하지 않는 모든 중첩 하위 디렉터리를 선택합니다.

powershell을 사용하여 특정 파일을 포함하거나 포함하지 않는 모든 중첩 하위 디렉터리를 선택합니다.

조건에 따라 (많은) 중첩 폴더 목록을 반환할 수 없으며 이 문서와 같은 사이트에서 온라인으로 검색하는 등 몇 시간 동안 다양한 방법을 시도했습니다.

나는 다음 줄을 시도하고 있습니다 :

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

다음 두 가지 조건을 충족하는 폴더 목록을 반환할 것으로 예상됩니다. 직계 하위 항목으로 하나 이상의 .mp3 파일을 포함하지만 직계 하위 항목으로 "√.txt"라는 파일은 포함하지 않습니다. 즉, 다음과 같습니다.

-music
--artist
---album
----song1.mp3은 앨범 디렉토리 이름이나 경로만 반환하는 반면,
-music
--artist
---album
----√.txt
----song1. mp3는
건너뛰고 약 10,000개의 다양하게 중첩된 앨범에 대해 반복됩니다.

더 간단히 말하면, 다음 코드는 1개 이상의 .mp3 파일을 (직접 하위 항목으로) 포함하는 하위 디렉터리 목록을 반환할 것으로 예상하지만 그렇지 않습니다.

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

-recur 호출에도 불구하고 현재 디렉터리의 직접 하위 항목("rock" 또는 "jazz"와 같은 범주 폴더)만 반환합니다.

내가 원하는 것은 수천 개의 중첩된 하위 디렉터리가 있는 "music" 폴더를 검색하고 (직계 하위 디렉터리로) mp3를 동시에 포함하지만 "√를 포함하지 않는 하위 디렉터리 목록을 반환하는 것입니다. .txt"(직계 하위 항목).

이것이 충분히 의미가 있기를 바랍니다! 더 많은 정보나 명확성이 필요한 경우 알려주십시오.

다음은 폴더 구조의 일부입니다.

디렉토리: D:\music\rock\90s\Stereolab\albums:
1992 - Peng!
1992 - 켜짐
1994 - Mars Audiac Quintet

감사합니다!

답변1

단 하나의 명령으로 이를 수행할 수 있는 방법은 없습니다. 당신이 할 일은 적어도 하나의 mp3를 포함하는 모든 폴더의 목록을 만든 다음 해당 목록으로 두 번째 루프를 수행하고 해당 폴더에 파일이 포함되어 있는지 확인하는 것입니다. 그렇다면 목록에서 해당 항목을 제거하십시오.

다음은 이에 대한 예제 스크립트입니다.

$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

관련 정보