Mostrando solo archivos ADS

Mostrando solo archivos ADS

Actualmente, el código que estoy usando para mostrar archivos de flujo de datos alternativos (ADS) cmd.exees dir /R.

Sin embargo, lo que esto hace es enumerar todos mis otros archivos, además de los archivos ADS.

La pregunta es: ¿qué comando debo usar parasolomostrar archivos ADS.


El comando dir C:\ /r /s | findstr /r "\$DATA"es el mejor que he encontrado, aunque no estoy muy convencido de su precisión. ¿Cualquier otro?

Respuesta1

AltStreamDumpLa utilidad (de Nirsoft) también puede hacer esto.

EDITAR: También hay una aplicación GUIVista de transmisión alternativa(Nirsoft también) que tienen soporte de línea de comandos y permiten, por ejemplo, exportar la lista a un archivo

Respuesta2

Muy bueno: nunca antes había oído hablar de ADS y tuve que buscar qué era.

No puedo garantizar qué tan confiable es su método, pero puedo ver tres formas de mejorarlo potencialmente.

1) Un archivo normal podría llamarse "$DATA". Puede mejorar la precisión de su filtro utilizando:

findstr /el :$DATA


2) Pierdes la información de la ruta cuando usas DIR /R /Sla opción y conservas solo las :$DATAlíneas. Aquí hay una línea desagradable que enumera el tamaño del archivo y la ruta completa para todos los ADS. Redirijo stderr a nul para ocultar mensajes de error de carpetas inaccesibles:

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) Se puede adjuntar un ADS tanto a una carpeta como a un archivo. Supongamos que existe la siguiente estructura de carpetas: C:\root\child\grandchild\. Supongamos también que C:\root\childtiene un ADS llamado child:ads.txt. El DIR /R /Scomando enumerará los ADS en los siguientes tres niveles:

  • C:\rootlistaráchild:ads.txt:$DATA

  • C:\root\childlistará.:ads.txt:$DATA

  • C:\root\grandchildlistará..:ads.txt:$DATA

Sólo se desea el primer listado. Dentro del bucle FOR /F, el tamaño de %Bse puede obtener usando %~zB, pero eso solo funciona para el primer listado; se expande a una cadena vacía para los otros dos. Esto proporciona una manera conveniente y eficiente de eliminar los listados no deseados.

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


La solución final se ve mucho mejor como un script por lotes de varias líneas.

@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


Simplemente elimine %%A(o %A) del comando ECHO si solo desea las rutas de los archivos ADS sin los tamaños de los archivos.

información relacionada