Interfaz de línea de comandos

Interfaz de línea de comandos

Sé que el Explorador de Windows puede colorear el estado de compresión NTFS de un archivo, tanto en la vista normal como en la de búsqueda.

¿Cómo puedo filtrar/buscar específicamente archivos comprimidos o descomprimidos en el nivel NTFS?

Preferiblemente una solución que funcione en Windows XP y versiones posteriores (hay bastantes dispositivos de hardware para los cuales no hay controladores disponibles para Vista y versiones posteriores).

Dado que Windows Search consume demasiada CPU, también me gustaría una solución sin eso.

Respuesta1

Interfaz de línea de comandos

Windows XP no proporciona una manera de enumerar archivos comprimidos de forma inmediata, e incluso los métodos de búsqueda avanzada no están diseñados para tales tareas. El símbolo del sistema viene al rescate:

cd /d "C:\Some folder"
compact | findstr /c:" 1 C"

El cdcomando se usa simplemente para navegar al directorio de destino. Cuando el compactcomando se ejecuta sin parámetros, enumerará todos los archivos junto con sus detalles de compresión, si los hay. Luego, la salida se puede filtrar redirigiéndola a findstr. Por si sirve de algo, este método debería funcionar incluso en Windows 2000.

Aún así, el resultado es bastante detallado. Para eliminar la información adicional se requiere algo más de trabajo:

for /f "tokens=9,*" %A in ('"compact | findstr /c:" 1 C" "') do @dir /b "%A*%B" 2>nul

El comando anterior mostrará solo nombres de archivos comprimidos. El dircomando ayudará a validar los nombres de los archivos para evitar falsos positivos (por ejemplo, aquellos que contienen la cadena 1 Cen su nombre).

Los parámetros adicionales que puede utilizar son:

  • /sAplica el comando a todas las subcarpetas.
  • /aMuestra archivos ocultos o del sistema.

Tenga en cuenta que esos parámetros deben usarse tanto para los comandos compactcomo dir, si es necesario.

Para enumerar archivos sin comprimir, puede usar el /vparámetro del findstrcomando para invertir el filtro y cambiar el tokensvalor a 8(eso se debe a que los archivos sin comprimir no tienen el Cmarcador, lo que afecta la cadenatokenización).

Otras lecturas


Sintaxis de consulta avanzada

Las consultas de búsqueda de Windows se especifican en la sintaxis de consulta avanzada (AQS), que no solo admite búsquedas de texto simples, sino que también proporciona operaciones de consulta avanzadas basadas en propiedades.

Fuente:Búsqueda de Windows: sintaxis de consulta avanzada

AQS se introdujo por primera vez con Windows Desktop Search, que luego se mejoró e integró en Windows Vista comoBúsqueda de Windows. Necesitasinstalarlo por separadoen sistemas operativos anteriores.

La siguiente consulta enumerará todos los archivos que tienen el atributo de archivo configurado y están comprimidos. Funciona en Windows XP, Vista y 7. También debería funcionar en Windows 8.x, aunque no lo probé.

System.FileAttributes:(2080)

En configuraciones regionales en inglés también puedes usar:

attributes:(2080)

Aquí hay una lista de los valores más útiles:

FILE_ATTRIBUTE_READONLY = 1
FILE_ATTRIBUTE_HIDDEN = 2
FILE_ATTRIBUTE_SYSTEM = 4
FILE_ATTRIBUTE_ARCHIVE = 32
FILE_ATTRIBUTE_COMPRESSED = 2048
FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = 8192

En el ejemplo anterior combiné FILE_ATTRIBUTE_ARCHIVEy FILE_ATTRIBUTE_COMPRESSED: 32 + 2048 = 2080.

Puede buscar cualquier combinación utilizando el ORoperador lógico. Por ejemplo, para buscar archivos comprimidos que sean de sólo lectura o no:

System.FileAttributes:(2080 OR 2081)

Para invertir los resultados de la búsqueda puede utilizar el NOToperador:

System.FileAttributes:NOT(2080 OR 2081)

Otras lecturas

Respuesta2

y31415ha publicadouna buena solución para el Explorador de Windowseso funciona al menos en Windows 7 y versiones posteriores (tal vez en Vista, lo comprobaré más adelante).

Entonces, para versiones anteriores de Windows como XP y 2003, busqué una solución de línea de comandos que pudiera generar una lista de archivos comprimidos o sin comprimir.

Compact: agradable, pero la salida es difícil de analizar

La primera idea fue utilizarcompacto, que se envía con Windows.

Y, de hecho, puede enumerar archivos (encierre los parámetros entre comillas dobles cuando contengan espacios):

compact [filemask] /a /s:[directoryname]

El formato es fácil de leer para los humanos, pero no fácil de analizar.

FindCompressed tiene un error con nombres de ruta largos que dan listados como este:

C:\Program Files\VMware\Infrastructure\Virtual Infrastructure Client\Help\en\DRS41\wwhelp\wwhimpl\common\htmlinit3.htm
C:\Program Files\VMware\Infrastructure\Virtual Infrastructure Client\Help\en\DRS41\wwhelp\wwhimpl\common\htmlpagenav.htm
...
C:\Program Files\VMware\Infrastructure\Virtual Infrastructure Client\Help\en\DRS41\wwhelp\wwhimpl\common\html\imagessplash.jpg
C:\Program Files\VMware\Infrastructure\Virtual Infrastructure Client\Help\en\DRS41\wwhelp\wwhimpl\common\imagestoolsbg.gif
...
C:\Program Files\VMware\Infrastructure\Virtual Infrastructure Client\Help\en\DRS41\wwhelp\wwhimpl\common\scriptsunidata.js

Por lo tanto, corta partes de los archivos o directorios cuando los nombres son demasiado largos.

# FindCompressed: bien, es necesario eliminar la primera/última línea de salida

Exodus Development escribió la herramienta de línea de comandosBuscarComprimido. Sin parámetros, encuentra archivos comprimidos. Con el -suparámetro busca archivos sin comprimir. Encierre [directoryname]entre comillas dobles cuando contenga espacios.

FindCompressed.exe -su [nombre del directorio]

FindCompressedtiene un inconveniente: siempre comienza la salida con esta línea donde # es [nombre del directorio]:

Recursive search of compact #.

y termina con una línea como esta:

Found # uncompressed files in # items examined. 

Las líneas entre ellas contienen una ruta completa al nombre del archivo comprimido o sin comprimir.
Eso es fácil de analizar.

Respuesta3

Dado que compacto muestra a Cen una posición fija:

134217728 : 0 = 1.0 a 1 C BigFile.Dummy 123456789012345678901234567890123= La posición 33 indica si está comprimido en NTFS.

Dado que todos los archivos comprimidos se enumeran de forma compacta con una C en el carácter 33 (al menos en donde lo ejecuto, tal vez otros idiomas sean diferentes), tal vez este comando pueda ayudar:

compact /A | findstr /R ^................................C

/R indicates that the following is a regular expression ^ is to indicate look from beggining of line The 32 dots for ignoring 32st charaters of the line Then the C to indicate must look for a C at the 33th position, that indicates it is NTFS compressed

Lo que hace es enumerar todos los archivos y luego filtrar buscando Cen la posición 33 desde el principio de la línea.

Si desea recursivo, use un bucle for que enumere todos los directorios y ejecute ese comando en cada uno, como este gran comando de muestra (si se escribe directamente en la línea de comando):

(CD "C:\YourBaseDir\" && ECHO Listing NTFS compressed files and folders:  && (compact /A /I | findstr /R ^................................C) && for /F "delims=" %a in ('DIR /AD/B/S') do @(CD "%a" && ECHO Listing NTFS compressed files and folders on: "%a" && (compact /A /I | findstr /R ^................................C)) & CD "C:\YourBaseDir\")

Si coloca el comando dentro de un archivo BATCH, %adebe duplicar el valor %, por lo que debe ser así (todo en una línea grande):

(CD "C:\YourBaseDir\" && ECHO Listing NTFS compressed files and folders:  && (compact /A /I | findstr /R ^................................C) && for /F "delims=" %%a in ('DIR /AD/B/S') do @(CD "%%a" && ECHO Listing NTFS compressed files and folders on: "%%a" && (compact /A /I | findstr /R ^................................C)) && CD "C:\YourBaseDir\")

O para una mejor lectura en un archivo BATCH:

@ECHO OFF
CD "C:\YourBaseDir\"
ECHO Listing NTFS compressed files and folders:
compact /A /I | findstr /R ^................................C
for /F "delims=" %%a in ('DIR /AD/B/S') do @(
 CD "%%a"
 ECHO Listing NTFS compressed files and folders on: "%%a"
 compact /A /I | findstr /R ^................................C
)
CD "C:\YourBaseDir\"

Advertencia: Compact también mostrará carpetas comprimidas, para evitarlas es necesario un doble for.

El resultado es así:

Listing NTFS compressed files and folders:
        0 :         0 = 1.0 a 1 C a
134217728 :         0 = 1.0 a 1 C BigFile.Dummy
Listing NTFS compressed files and folders on: "D:\Temp\a"
        0 :         0 = 1.0 a 1 C b
134217728 :         0 = 1.0 a 1 C Other.Dummy
Listing NTFS compressed files and folders on: "D:\Temp\a\b"
134217728 :         0 = 1.0 a 1 C Another.Dummy

Espero que ayude, se basa en findtr que permite expresiones regulares, así que adapte la expresión regular a la versión e idioma de su sistema operativo.

Esto sería para mostrar solo archivos (no carpetas) en la lista de resultados (dentro de un archivo BATCH con buena lectura):

@ECHO OFF
CD "D:\YourBaseDir\"
ECHO Listing NTFS compressed files:
for /F "delims=" %%a in ('DIR /A-D/B') do @(
 compact /A /I "%%a" | findstr /R ^................................C
)
for /F "delims=" %%a in ('DIR /AD/B/S') do @(
 for /F "delims=" %%b in ('DIR /A-D/B "%%a"') do @(
  ECHO Listing NTFS compressed files on: "%%a\"
  compact /A /I "%%a\%%b" | findstr /R ^................................C
 )
)

El truco para no mostrar carpetas es usar un FOR específico para procesar solo el /A-Dparámetro de archivos en FOR; a costa de llamar a compact/findstr para cada archivo individual.

Y tenga en cuenta que este no sirve CDpara cambiar al directorio... pasa la ruta completa al archivo para compactar como parámetro... ¡¡¡advertencia con rutas largas !!!

El resultado es entonces así (no se muestran carpetas):

Listing NTFS compressed files:
134217728 :         0 = 1.0 a 1 C BigFile.Dummy
Listing NTFS compressed files on: "D:\Temp\a\"
134217728 :         0 = 1.0 a 1 C Other.Dummy
Listing NTFS compressed files on: "D:\Temp\a\b\"
134217728 :         0 = 1.0 a 1 C Another.Dummy

También se podría mejorar (como todo en este mundo) usando sed(de GNU para Windows) que permite cortar la parte del nombre del archivo del par compact/findstr y también con un ECHO que concatena la ruta y el sedresultado.

Espero que esto pueda ayudar con la tarea.

información relacionada