Файл может не иметь выделенных блоков; флаг -s
на ls
покажет это различие, в то время как для каталога будет выделено некоторое количество минимальных блоков, следовательно, размер по умолчанию. (Если только вы не используете какую-то модную современную файловую систему, которая выкидывает эти понятия из окна.) Например:
% mkdir testfoo
% cd testfoo/
% mkdir foodir
% touch foofile
% ln -s foofile foosln
% ls -ld foo*
drwxrwxr-x 2 jmates jmates 512 Oct 5 19:48 foodir
-rw-rw-r-- 1 jmates jmates 0 Oct 5 19:48 foofile
lrwxrwxr-x 1 jmates jmates 7 Oct 5 19:48 foosln -> foofile
% ls -lds foo*
8 drwxrwxr-x 2 jmates jmates 512 Oct 5 19:48 foodir
0 -rw-rw-r-- 1 jmates jmates 0 Oct 5 19:48 foofile
0 lrwxrwxr-x 1 jmates jmates 7 Oct 5 19:48 foosln -> foofile
%
Обратите внимание, что символическая ссылка здесь не принимает блоков, несмотря на выделение семи байтов для деталей, необходимых для readlink (2)
, как любопытно! В любом случае, давайте теперь добавим в foofile
один или два байта:
% echo >> foofile a
% ls -lds foo*
8 drwxrwxr-x 2 jmates jmates 512 Oct 5 19:48 foodir
8 -rw-rw-r-- 1 jmates jmates 2 Oct 5 19:49 foofile
0 lrwxrwxr-x 1 jmates jmates 7 Oct 5 19:48 foosln -> foofile
%
И можно увидеть, что выделенные блоки для foofile
переместились на 8
, несмотря на то, что только два байта (прикреплены a
и новая строка echo
).
Файлы также могут быть разреженными, что является еще одним фактором, по которому сообщаемый размер файла может отличаться от фактического содержимого, в зависимости от того, как инструмент, взаимодействующий с файлом, обрабатывает эту разреженность.
Кроме того, размер каталога можно увеличить, создать много файлов с очень длинными именами и проверить, что происходит с размером каталога (и с выделенными блоками) после создания каждого нового длинного имени файла с помощью ls -lds.
rsync
может быть инструментом для вас. Его необходимо установить с обеих сторон трансфера. Вот пример команды, бессовестно скопированный из этого обсуждения:
rsync --partial --progress --rsh=ssh local_file user@host:remote_file