
현재 ADS(대체 데이터 스트림) 파일을 표시하는 데 사용하는 코드 cmd.exe
는 dir /R
.
그러나 이것이 수행하는 작업은 ADS 파일 외에도 다른 모든 파일을 나열한다는 것입니다.
문제는 - 어떤 명령을 사용해야 합니까?오직ADS 파일을 표시합니다.
이 명령은 dir C:\ /r /s | findstr /r "\$DATA"
제가 찾을 수 있는 것 중 최고입니다. 비록 그 정확성에 대해서는 그다지 확신하지 못하지만요. 다른 사람도 있나요?
답변1
AltStreamDumpNirsoft의 유틸리티도 이 작업을 수행할 수 있습니다.
편집: GUI 응용 프로그램도 있습니다AlternateStreamView(Nirsoft도) 명령줄을 지원하고 예를 들어 목록을 파일로 내보낼 수 있습니다.
답변2
매우 멋지네요. 이전에 ADS에 대해 들어본 적이 없어서 그것이 무엇인지 찾아보아야 했습니다.
귀하의 방법이 얼마나 신뢰할 수 있는지는 보장할 수 없지만 잠재적으로 이를 개선할 수 있는 세 가지 방법은 있습니다.
1) 일반 파일 이름은 "$DATA"로 지정할 수 있습니다. 다음을 사용하여 필터의 정확도를 향상시킬 수 있습니다.
findstr /el :$DATA
2) 옵션을 사용하면 경로 정보가 손실되고 DIR /R /S
행만 유지됩니다 :$DATA
. 다음은 모든 ADS의 파일 크기와 전체 경로를 나열하는 불쾌한 내용입니다. 액세스할 수 없는 폴더에서 오류 메시지를 숨기기 위해 stderr를 nul로 리디렉션합니다.
for /r %F in (.) do @(pushd "%F"&&(for /f "tokens=1*" %A in ('dir /r^|findstr /el :$DATA') do @echo %A %~fB)&popd)2>nul
3) ADS는 파일뿐만 아니라 폴더에도 첨부될 수 있습니다. 다음 폴더 구조가 있다고 가정합니다. C:\root\child\grandchild\
. 또한 이라는 C:\root\child
이름의 ADS가 있다고 가정합니다 child:ads.txt
. 이 DIR /R /S
명령은 다음 세 가지 수준의 ADS를 나열합니다.
C:\root
나열할 것이다child:ads.txt:$DATA
C:\root\child
나열할 것이다.:ads.txt:$DATA
C:\root\grandchild
나열할 것이다..:ads.txt:$DATA
첫 번째 목록만 원합니다. FOR /F 루프 내에서 를 사용하여 크기를 %B
얻을 수 있지만 %~zB
이는 첫 번째 목록에서만 작동합니다. 다른 두 문자열에 대해서는 빈 문자열로 확장됩니다. 이는 원치 않는 목록을 제거하는 편리하고 효율적인 방법을 제공합니다.
for /r %F in (.) do @(pushd "%F"&&(for /f "tokens=1*" %A in ('dir /r^|findstr /el :$DATA') do @if .%~zB neq . echo %A %~fB)&popd)2>nul
최종 솔루션은 여러 줄의 배치 스크립트로 훨씬 좋아 보입니다.
@echo off
for /r %%F in (.) do (
pushd "%%F" &&(
for /f "tokens=1*" %%A in (
'dir /r^|findstr /el :$DATA'
) do if "%%~zB" neq "" echo %%~zB %%~fB
popd
)
)2>nul
파일 크기 없이 ADS 파일 경로만 원하는 경우 ECHO 명령에서 제거 %%A
(또는 )하면 됩니다.%A