Чем именно «% ~ zI» расширен для каталогов в циклах FOR? - PullRequest
0 голосов
/ 01 ноября 2018

С FOR /?:

In addition, substitution of FOR variable references has been enhanced.
You can now use the following optional syntax:

    %~I         - expands %I removing any surrounding quotes (")
    %~fI        - expands %I to a fully qualified path name
    %~dI        - expands %I to a drive letter only
    %~pI        - expands %I to a path only
    %~nI        - expands %I to a file name only
    %~xI        - expands %I to a file extension only
    %~sI        - expanded path contains short names only
    %~aI        - expands %I to file attributes of file
    %~tI        - expands %I to date/time of file
    %~zI        - expands %I to size of file
    %~$PATH:I   - searches the directories listed in the PATH
                   environment variable and expands %I to the
                   fully qualified name of the first one found.
                   If the environment variable name is not
                   defined or the file is not found by the
                   search, then this modifier expands to the
                   empty string

Я запустил пакетный скрипт Windows, который выполняет @echo %~aI %~fI ^<%~zI byte^(s^)^> в цикле FOR, проходящем по каталогам (путь каждого из которых хранится в %I), и получил следующий вывод:

d--hs------ J:\$RECYCLE.BIN  <0 byte(s)>
d---------- J:\Multimedia  <4096 byte(s)>
dr--------- J:\-C-\……\Desktop  <12288 byte(s)>
dr--------- J:\-C-\……\Documents  <28672 byte(s)>
dr--------- J:\-C-\……\Downloads  <81920 byte(s)>

Эти «размеры» каталогов выше не имеют ничего общего с размерами файлов в них. Что именно означает «размер» от %~zI? Был бы %I нормальный файл, это был бы его размер. Но что, если %I является каталогом? Я не могу понять это. Это действительно бессмысленно?

1 Ответ

0 голосов
/ 01 ноября 2018

Это использованное пространство для записи каталога

Каждый каталог на самом деле является специальным файлом, который содержит другие файлы и каталоги, поэтому он должен где-то хранить этот список вместе с другими необходимыми метаданными, если это необходимо. Некоторые файловые системы выделяют обычные кластеры и сохраняют метаданные в этой области данных.

В NTFS небольшие файлы могут оставаться резидентными в записи MFT , поэтому вы можете видеть некоторые нулевые папки, поскольку для метаданных каталога не нужны отдельно выделенные блоки

Вы можете проверить это с помощью fsutil file layout directory_path и посмотреть на $I30:$INDEX_ALLOCATION поток

Например, вот вывод с моего компьютера. Одинаковый размер можно увидеть в %~zI и fsutil output

C:\>for /d %I in (*) do @echo %~aI %~fI  ^<%~zI byte^(s^)^>
d---------- C:\ESD  <0 byte(s)>
d---------- C:\Intel  <0 byte(s)>
d---------- C:\OLYMPUS  <0 byte(s)>
d---------- C:\PerfLogs  <0 byte(s)>
dr--------- C:\Program Files  <16384 byte(s)>
dr--------- C:\Program Files (x86)  <12288 byte(s)>
dr--------- C:\Users  <4096 byte(s)>
d---------- C:\Windows  <16384 byte(s)>

PS C:\> ls -Attributes Directory | ForEach-Object {
    $_.Name
    fsutil file layout $_ | bash -c 'grep -A 20 INDEX_ALLOCATION' | `
        sls -Pattern 'INDEX_ALLOCATION|Size' | select-object -First 2 }
ESD
Intel
OLYMPUS
PerfLogs
Program Files

Stream                  : 0x0a0  :$I30:$INDEX_ALLOCATION
    Size                : 16,384
Program Files (x86)
Stream                  : 0x0a0  :$I30:$INDEX_ALLOCATION
    Size                : 12,288
Users
Stream                  : 0x0a0  :$I30:$INDEX_ALLOCATION
    Size                : 4,096
Windows
Stream                  : 0x0a0  :$I30:$INDEX_ALLOCATION
    Size                : 16,384

То же самое происходит в * nix, когда размер, отображаемый ls -l, не является общим размером файлов в каталоге:

...