와일드 카드 경로를 확장하기 위해 Windows cmd 쉘을 얻는 방법이 있습니까?


37

때때로 cmd 쉘이 와일드 카드 경로를 확장 할 수없는 것은 실제로 불편할 수 있습니다. 디렉토리의 100 개 파일을 프로그램으로 전달해야했고 * .ext를 입력 할 수 없었습니다. 대신 mingw의 'ls'를 사용하여 목록을 파일로 덤프 한 다음 줄 바꿈을 공백으로 바꾸고 복사하여 cmd에 붙여 넣었습니다. 꽤 악몽.

나는 대답이 '아니오'라고 의심하지만, 이것을 다루거나 더 쉽게 할 수있는 방법을 가진 사람이 있습니까?


2
대신 Powershell과 같은 것을 사용해 보셨습니까?

I suspect the answer will be no, but has anyone dealt with this or come up with any way to make this easier? 사실, 나는 반대의 문제를 겪고 있습니다. 명령 인터프리터가 목록을 문자열로 취급하고 와일드 카드로 보답 하지 못하게 하는 방법을 찾으려고 노력하고 있습니다. 예를 들어, for %i in (foobar baz really?) do @echo %i마지막 항목 (취급합니다 really?파일 이름에 와일드 카드 등을), 및라는 이름의 파일이없는 경우를 건너 really1, reallyz☹ 등,
Synetech

1
@Synetech- ?Windows 파일 시스템의 파일 이름에 유효한 문자가 아닙니다. 문자는 와일드 카드로만 해석 될 수 있습니다. MSDN에서 파일, 경로 및 네임 스페이스 이름 지정 및 TechNet에서 와일드 카드 문자 사용을 참조하십시오 .
jww

답변:


18

DOS와 결과적으로 Windows cmd.exe는 쉘에 의한 와일드 카드 확장을 지원하지 않았습니다. 확장을 수행하는 것은 항상 애플리케이션에 달려 있습니다.

즉, 확장을 지원하지 않는 응용 프로그램을 사용하는 경우 항상 다른 경로를 찾아야합니다. 당신은 할 수 있습니다 :

  • FOR 루프사용하여 관심있는 모든 파일에 대해 일부 명령을 실행 하십시오.
  • 사용 dir /b > list.txt용도에 dir당신이에 붙여 명령의 목록을 생성 정말 필사적 경우 다음 Excel 수식 같은 것을 사용할 수 있습니다 (확장을 수행 할 명령을 텍스트 파일로 파일 목록을 넣어 cmd, 또는 Excel을 사용할 수 있습니다 모든 파일 이름이 같은 줄에 있도록 셀을 바꿉니다.)

그는 dir 결과를 파일로 출력하고 수동으로 필터링 및 복사를 처리하는 것은 악몽이라고 설명했다. wmz의 답변과 물론 파일 내용을 수동으로 필터링하지 않고도 작동합니다.
wullxz

1
@ wullxz : 아마도 일회성으로 이것을하고 싶어하는 Powershell에 익숙하지 않은 사람에게는 상당히 빠를 수 있습니다.이 사이트의 아이디어는 모든 기술 수준의 사람들에게 현재와 안으로 참조 할 수있는 유용한 솔루션을 제공하는 것입니다 내 대답이 당신만큼 좋지 않다고 생각하기 때문에 앞으로 나에게 말할 필요가 없습니다.
Malvineous

1
"DOS 및 결과적으로 Windows 'cmd.exe는 셸의 와일드 카드 확장을 지원하지 않습니다." -Microsoft에 따르면 사실이 아닙니다. TechNet에서 와일드 카드 문자 사용을 참조하십시오 . (그러나 나는 당신이 실제로 옳다고 생각합니다 : o. 그렇지 않으면, 왜 파일이 ​​일치하지 않는지 알아 내려고하지 않을 것입니다)
jww

1
@ jww : 게시 한 링크는 와일드 카드 문자의 표준 사용법을 설명하지만 쉘에 의해 확장 된 언급은 없습니다. UNIX (및 이후의 Linux 및 Mac)와 달리 Microsoft는 명령 줄 매개 변수를 그대로 전달하여 구현할 각 개별 응용 프로그램까지 와일드 카드 확장을 남겨 두었습니다.
Malvineous

1
DOS 명령 'dir Filespec / b'는 한 줄에 하나씩 파일 목록을 생성하기 때문에 실제로 잘 작동합니다. 추가 '/ s'스위치를 사용하면 파일 이름이 정규화되고 (절대) for 루프를 통해 파일 이름을 사용하는 다른 명령 줄 프로그램에 쉽게 제공 할 수 있습니다. Windows에는 적절한 글 러빙 기능이 없기 때문에 최선을 다할 수 있습니다.
David A. Grey

9

Windows 7에 사전 설치된 Powershell을 사용하십시오. Powershell은 cmd 명령을 실행할 수 있으며 경로의 어느 위치에서나 와일드 카드를 이해합니다.

Powershell을 시작하려면 시작 메뉴 검색 상자에 "powershell"을 입력하고 Enter 키를 누르십시오.


응용 프로그램에 모든 파일 이름이 포함 된 문자열이 필요한 경우 올바른 스크립트입니다.

$delimiter = " "
[string]$files = $nothing ; ls *.txt | % { $files += $_.fullname + $delimiter } ; application.exe $files

변경 $delimiter = " "에 대한 $delimiter = ","응용 프로그램이 쉼표를 기대하는 경우 파일 이름의 목록을 분리했다.

코드 설명 :

  • [string]$files = $nothing -유형의 빈 변수를 만듭니다. string
  • ; -파이프 라인이 아닌 여러 명령의 구분 기호입니다!
  • ls *.txt | % { $files += $_.fullname + $delimiter } -모든 텍스트 파일 목록을 가져오고 구분 기호로 구분 된 모든 파일 이름으로 문자열을 만듭니다.
  • application.exe $files -응용 프로그램을 호출하고 파일 목록을 전달합니다

전체 코드를 다음과 같이 추가 -recurse하여 파일 패턴을 재귀 적으로 검색 할 수도 있습니다 ls *.txt.

$delimiter = " "
[string]$files = $nothing ; ls *.txt -recurse | % { $files += $_.fullname + $delimiter } ; application.exe $files

편집 :
자극을 피하려면 ls하고 dir있는의 별칭을 Get-ChildItem하고 %별칭입니다 ForEach-Object. 코드가 짧기 때문에 사용 된 별칭으로 코드를 유지합니다.

2018/04/25 편집 :
2012 년에 PowerShell을 처음 접했습니다 . 물론 유닉스 / 리눅스의 글로브 확장 기능만큼 쉽지는 않지만 더 쉬운 방법이 있습니다.

app.exe $(ls *.txt | % {$_.FullName})

설명:

  • $ ()은 먼저 표현식을 평가하고 그 표현식의 출력으로 바꿉니다 (백틱이 bash에서와 마찬가지로)
  • ls *.txt glob와 일치하는 모든 파일의 FileInfo 객체를 가져옵니다. *.txt
  • PowerShell은 객체 지향적이므로 각 FileInfo 객체의 전체 이름을 출력해야합니다. PowerShell에서 속성 / 속성의 이름을 지정하면 기본적으로 출력됩니다. % { $_.FileName }우리를 위해 그렇게합니다. %에 의해 반환 된 모든 요소를 ​​반복하고 ls각 개체 FileName을 출력합니다.

2
PS는 확실히 요구를 충족시킬 수 있지만 그것에 익숙해지는 조언은 건전합니다. 제안한 것처럼 간단하지는 않습니다. 실행 start notepad++ *.txt(의도로 모든 textfiles를 엽니 다 - 그것은으로 사용 메모장 ++ 않는 여러 이름을 처리)을 아무데도 당신을 얻을 것
WMZ

1
로 해결할 수 dir *.txt | % { notepad++.exe $_ }있습니다. notepad ++가 없기 때문에 간단한 메모장으로 시도해 보았습니다. 이 명령은 현재 디렉토리의 모든 txt 파일 목록을 수신하고 목록을 반복하는 다음 명령으로 목록을 전달하고 파일 이름을 매개 변수로 notepad ++를 실행합니다.
wullxz

예, 그러나 이것은 동일하지 않습니다. 에 대해 생각 grep "a b c"찾을 수 있는 "AB C는"목록을 확장 할 것 나열된 문자열의
WMZ

5
항목 목록을 매개 변수로 사용 하여 명령 실행하는 것은 목록의 각 요소 를 매개 변수로 사용하여 명령을 여러 번 실행하는 것과 다릅니다. 다른 예 : copy a+b+c resultcopy a result copy b result copy c result. (그리고 유틸리티와 같은 grep은 PS에 존재합니다. select-string)
wmz

1
OP는 설명하기 위해 차임에 신경 쓰지 않는 것이 유감입니다.
wmz

8

이것은 당신에게리스트를 줄 것이고 또한 named라는 변수에 넣을 것입니다 expanded_list. 배치 파일에 넣고로 실행하십시오 myBatchFile name myPattern. 공백이 있으면 패턴을 따옴표로 묶으십시오. 더러워지지 않는 파일과 일치합니다. 매개 변수없이 실행하면 모두 일치합니다.

@echo off
set expanded_list=
for /f "tokens=*" %%F in ('dir /b /a:-d "%~1"') do call set expanded_list=%%expanded_list%% "%%F"

echo expanded_list is: 
echo %expanded_list%

그런 다음 명령을 실행할 수 있습니다 my_command_exec %expanded_list%

경고! cmd 변수의 최대 크기는 8191 자 (XP 이상)이므로 오버플로 할 수 있습니다! 항상 완전한 목록을 제공하기 위해 유틸리티를 사용할 수는 없습니다. 반면, 최대 cmd 줄 길이는 8191이므로 어쨌든 실행할 수 없습니다.


인수가 지정되지 않은 경우 expand_list는 현재 디렉토리에있는 모든 파일로 설정되며, 원하는 파일이 아닐 수도 있습니다. 따라서 인수를 추가로 점검하지 않아도됩니다 (예 : "% 1"== ""...)
JasonM1

3

이것은 cmd.exe에서 작동합니다.

dir /b *.ext

또는

echo | dir /b *.ext

이것은 경로의 일부가 아닌 파일 이름에 대해서만 작동합니다. 예를 들어 dir /b TortoiseSVN\bin\sv*.exe표시됩니다 svn.exesvnadmin.exe. 그러나 dir /b TortoiseSVN\bi*\svn.exe구문 오류를 보여줍니다.
styfle

1
확인하십시오 dir /s /b. 이것은 당신에게 전체 경로를 제공합니다.
WesternGun

3

참고로, 이것은 별도의 스레드 사용자 포스터에 포스터에 대한 주석입니다)

DIR은 모든 하위 디렉토리에서 특정 유형과 일치하는 파일을 검색 할 수 있으며 허용합니다.

참고 : 모든 하위 디렉토리가 있는지 확인하는 루트 디렉토리는 작성자가 이러한 디렉토리가있는 경로 이름을 제공하지 않았기 때문에 "C : \ My Program \ Root \"로 가정합니다.

DIR /B /S "C:\My Program\Root\*.ext"

소스 파일의 전체 파일 경로와 파일 이름이 제공됩니다.

파일 이름 만 원하면 다음과 같이해야합니다.

FOR /F "Tokens=*" %A IN ('DIR /B /S "C:\My Program\Root\*.ext"') DO @( Echo.%~nxA )

이러한 파일을 모두 "C : \ My Program \ Root \ Sub Directories \ *. ext"에서 "D : \ Singlefolder \ *. ext"로 이동하려는 경우 다음과 같이하면됩니다.

FOR /F "Tokens=*" %A IN ('DIR /B /S "C:\My Program\Root\*.ext"') DO @( MOVE "%~A" "D:\Singlefolder\%~nxA" /Y )

미래에 다른 사람들을 돕는 희망. :)


1

이것은 오래되었지만 Windows 용 Linux 하위 시스템으로 인해 PATH에 bash가있는 것이 일반적입니다. 이 경우에는 트릭을 수행 할 수 있습니다.

bash -c 'cat *.txt'

참고 작은 따옴표는 Windows에서 특별하지 않습니다는 cmd를 당신이 작동하지 않습니다 cmd를에서 위의 명령을 실행하여 경우. 그리고 이것은 Cygwin 또는 다른 bash 환경을 가진 시스템에도 적용됩니다
phuclv
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.