Mostrando apenas arquivos ADS

Mostrando apenas arquivos ADS

Atualmente, o código que estou usando para mostrar arquivos Alternate Data Stream (ADS) cmd.exeé dir /R.

No entanto, o que isso faz é listar todos os meus outros arquivos, além dos arquivos ADS.

A questão é: qual comando devo usar paraapenasexibir arquivos ADS.


O comando dir C:\ /r /s | findstr /r "\$DATA"é o melhor que posso encontrar - embora não esteja muito convencido de sua precisão. Algum outro?

Responder1

AltStreamDumputilitário (da Nirsoft) também pode fazer isso.

EDIT: Também existe um aplicativo GUIAlternateStreamView(Nirsoft também) que possuem suporte de linha de comando e permitem, por exemplo, exportar lista para um arquivo

Responder2

Muito legal - eu nunca tinha ouvido falar de ADS antes e tive que pesquisar o que era.

Não posso garantir o quão confiável é o seu método, mas posso ver três maneiras de melhorá-lo potencialmente.

1) Um arquivo normal pode ser denominado "$DATA". Você pode melhorar a precisão do seu filtro usando:

findstr /el :$DATA


2) Você perde as informações do caminho ao usar DIR /R /Sa opção e mantém apenas as :$DATAlinhas. Aqui está um forro desagradável que lista o tamanho do arquivo e o caminho completo para todos os ADS. Redireciono stderr para nul para ocultar mensagens de erro de pastas inacessíveis:

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) Um ADS pode ser anexado a uma pasta e também a um arquivo. Suponha que exista a seguinte estrutura de pastas: C:\root\child\grandchild\. Suponha também que C:\root\childhaja um ADS chamado child:ads.txt. O DIR /R /Scomando listará os ADS nos três níveis a seguir:

  • C:\rootirá listarchild:ads.txt:$DATA

  • C:\root\childirá listar.:ads.txt:$DATA

  • C:\root\grandchildirá listar..:ads.txt:$DATA

Apenas a primeira listagem é desejada. Dentro do loop FOR /F, o tamanho de %Bpode ser obtido usando %~zB, mas isso só funciona para a primeira listagem; ele se expande para uma string vazia para os outros dois. Isso fornece uma maneira conveniente e eficiente de eliminar listagens indesejadas.

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


A solução final parece muito melhor como um script em lote de várias linhas

@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


Simplesmente remova %%A(ou %A) do comando ECHO se desejar apenas os caminhos dos arquivos ADS sem os tamanhos dos arquivos.

informação relacionada