ADS 파일만 표시

ADS 파일만 표시

현재 ADS(대체 데이터 스트림) 파일을 표시하는 데 사용하는 코드 cmd.exedir /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

관련 정보