Windows : 파일 이름 정규식을 사용한 파일 복사 / 이동?


10

나는 기본적으로 실행 하고 싶다 :

C:\>xcopy [0-9]{13}\.(gif|jpg|png) s:\TargetFolder /s

내가 알고 xcopy정규 표현식 파일 이름 검색을 지원하지 않습니다.

난 여부를 확인하는 방법을 찾을 수없는 PowerShell을Cmdlet파일을 복사하는 방법은; 그렇다면 정규 표현식 파일 이름 일치를 지원하는지 확인하는 방법.

누구나 정규식 파일 이름 일치로 재귀 파일 복사 / 이동을 수행하는 방법을 생각할 수 있습니까?


1
이것이 stackoverflow로 이동해야합니까?
user33788

1
@ smoknheap : 둘 다 될 수 있습니다 .Powershell 스크립팅이 점점 더 고급 사용자 도구가되고 있습니다. 이것은 xcopy 대체 질문보다 스크립팅 질문입니다.
Doltknuckle

답변:


5

가능하면 모든 Powershell 명령을 사용하는 것이 좋습니다. 약간의 테스트를 거친 후에는 이것이 최선의 방법입니다.

$source = "C:\test" 
$destination = "C:\test2" 
$filter = [regex] "^[0-9]{6}\.(jpg|gif)"

$bin = Get-ChildItem -Path $source | Where-Object {$_.Name -match $filter} 
foreach ($item in $bin) {Copy-Item -Path $item.FullName -Destination $destination}

처음 세 줄은 쉽게 읽을 수 있도록하기 위해 원하는 경우 실제 명령 내에서 변수를 정의 할 수 있습니다. 이 코드 샘플의 핵심은 정규식 일치를 허용하는 필터 인 "Where-Object"명령입니다. 정규 표현식 지원은 약간 이상합니다. 나는 PDF 참조 카드를 발견 여기 왼쪽에 지원되는 문자가 있습니다.

[편집하다]

"@Johannes Rössel"에서 언급했듯이 마지막 두 줄을 한 줄로 줄일 수도 있습니다.

((Get-ChildItem -Path $source) -match $filter) | Copy-Item -Destination $destination

주요 차이점은 Johannes의 방식은 객체 필터링을 수행하고 내 방식은 텍스트 필터링을 수행한다는 것입니다. Powershell로 작업 할 때는 거의 항상 개체를 사용하는 것이 좋습니다.

[편집 2]

@smoknheap에서 언급했듯이 위의 스크립트는 폴더 구조를 평평하게 만들고 모든 파일을 하나의 폴더에 넣습니다. 폴더 구조를 유지하는 스위치가 있는지 확실하지 않습니다. -Recurse 스위치를 시도했지만 도움이되지 않습니다. 내가 이것을 작동시키는 유일한 방법은 문자열 조작으로 돌아가서 폴더를 필터에 추가하는 것입니다.

$bin = Get-ChildItem -Path $source -Recurse | Where-Object {($_.Name -match $filter) -or ($_.PSIsContainer)}
foreach ($item in $bin) {
    Copy-Item -Path $item.FullName -Destination $item.FullName.ToString().Replace($source,$destination).Replace($item.Name,"")
    }

더 우아한 방법이 있다고 확신하지만 테스트에서 작동합니다. 그것은 모든 것을 모은 다음 이름 일치와 폴더 객체 모두를 필터링합니다. 문자열 조작에 액세스하려면 ToString () 메서드를 사용해야했습니다.

[편집 3]

이제 경로를보고하여 모든 것이 올바른지 확인하십시오. "Write-Host"명령을 사용할 수 있습니다. 다음은 진행 상황에 대한 힌트를 제공하는 코드입니다.

cls
$source = "C:\test" 
$destination = "C:\test2" 
$filter = [regex] "^[0-9]{6}\.(jpg|gif)"

$bin = Get-ChildItem -Path $source -Recurse | Where-Object {($_.Name -match $filter) -or ($_.PSIsContainer)}
foreach ($item in $bin) {
    Write-Host "
----
Obj: $item
Path: "$item.fullname"
Destination: "$item.FullName.ToString().Replace($source,$destination).Replace($item.Name,"")
    Copy-Item -Path $item.FullName -Destination $item.FullName.ToString().Replace($source,$destination).Replace($item.Name,"")
    }

관련 문자열을 반환해야합니다. 어딘가에 아무것도 없으면 문제가있는 항목을 알 수 있습니다.

도움이 되었기를 바랍니다


$item.FullName여기 에서 사용할 필요는 없습니다 . FileInfo 객체를 전달하면 적절한 속성이 자동으로 가져옵니다 (impo, 강력하지 않아야합니다. PowerShell의 기능은 문자열이 아닌 구조화 된 객체를 전달하기 때문에 발생합니다). 또한, 단일 파이프 라인에 모든 것을 넣을 수 있습니다 : ((gci $source) -match $filter) | cp -dest $destination(약간 간결에 맞게 - 변화 주시기 바랍니다, 난 그냥이 있다고 말하고 foreach필요가있다).
Joey

테스트 할 때 객체를 올바르게 파이프로 가져올 수 없었습니다. 그것은 foreach 명령을 사용하도록 강요합니다. 코드를 시험 해보고 어떤 일이 발생하는지 보겠습니다. 지적 해 주셔서 감사합니다.
Doltknuckle

대상 디렉토리를 평평하게 만드는 것과 같은 문제가 있습니까? xcopy는 일반적으로 대상 디렉토리의 디렉토리 구조를 유지합니까?
user33788

Copy-Item : Cannot bind argument to parameter 'Path' because it is null
Ian Boyd

참고 Trim다른 문자열의 끝에서 문자열을 제거하기위한 것이 아닙니다 대신 그것을가 호출되는 문자열의 시작 부분과 끝 부분에서 매개 변수 문자열에서 문자의 모든 인스턴스를 제거합니다. $item.Name대문자 C를 포함하는 경우 문자열의 시작 부분에서 드라이브 문자 C도 제거합니다.
Andris

3

PowerShell은 해당 작업을위한 훌륭한 도구입니다. 복사 프로세스에 Copy-Item cmdlet을 사용할 수 있습니다 . 당신은 복잡한 복사 명령에 대한 다른 cmdlet을 가진 파이프 라인을 수 여기 정확히 한 그 사람입니다 :)

정규식은 System.Text.RegularExpressions 네임 스페이스의 .NET RegEx 클래스를 사용하므로 이러한 클래스에 대한 빠른 방법 이 있습니다.

PowerShell에는 copy-item으로 파이프 라이닝 할 때 사용할 수있는 -match 및 -replace 연산자 가 있습니다.

RegEx 자체를 만드는 데 도움이되는 도구도 있습니다 (예 : RegEx 친구)


이럴, -match및은 -replace으로 가기 전에 언급해야한다 System.Text.RegularExpressions.RegEx. 적어도 저는 거의 [regex]직접 사용하지 않습니다 . 그러나 나는 않는 사용 빈도 -match-replace연산자를. 정규 표현식을 만들 때 PowerShell이 ​​작성하는 정규식을 테스트하고 수정하는 데 매우 유용하다는 것을 알았습니다.
Joey

이 질문에 대한 귀하의 답변에 대한 답변을 요청했습니다 : superuser.com/questions/149808/…
Ian Boyd

0

아이디어로하지만 약간의 작업이 필요합니다

dir -r | ? {$ _ -match '[0-9] {13} \. (gif | jpg | png)'} | % {xcopy $ _. fullname c : \ temp}

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.