
Actualmente, el código que estoy usando para mostrar archivos de flujo de datos alternativos (ADS) cmd.exe
es 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 /S
la opción y conservas solo las :$DATA
lí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\child
tiene un ADS llamado child:ads.txt
. El DIR /R /S
comando enumerará los ADS en los siguientes tres niveles:
C:\root
listaráchild:ads.txt:$DATA
C:\root\child
listará.:ads.txt:$DATA
C:\root\grandchild
listará..:ads.txt:$DATA
Sólo se desea el primer listado. Dentro del bucle FOR /F, el tamaño de %B
se 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.