Чем именно "%~zI" расширен для каталогов в циклах FOR?
От 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 ответ
Это израсходованное пространство для записи каталога
Каждый каталог на самом деле является специальным файлом, который содержит другие файлы и каталоги, поэтому он должен где-то хранить этот список вместе с другими необходимыми метаданными, если это необходимо. Некоторые файловые системы выделяют обычные кластеры и сохраняют метаданные в этой области данных.
В NTFS небольшие файлы могут оставаться резидентными в записи MFT, поэтому вы можете видеть некоторые нулевые папки, потому что для них не нужны отдельно выделенные блоки для метаданных каталога.
Вы можете проверить это с fsutil file layout directory_path
и посмотрите на $I30:$INDEX_ALLOCATION
поток
Например вот вывод с моего ПК. Такой же размер можно увидеть в %~zI
а также fsutil
выход
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
это не общий размер файлов внутри каталога: