3

Я просто случайно наткнулся на команду find в Linux, в двух словах: мне нужно было найти все файлы размером менее 2 КБ в определенной папке, поэтому я выполнил команду:

find /folder_to_search_into/ -type f -size -2k

который в соответствии с man-страницей find должен возвращать все, что меньше 2Kilobytes

Но я заметил, что в нем пропущено несколько файлов размером от 1 до 2 КБ.

Я тогда выпустил

find /folder_to_search_into/ -type f -size -2048c

который должен быть точным эквивалентом, так как "c" обозначает байты, и в этом случае он нашел все файлы, которые я искал.

Есть идеи, почему это поведение? Я, наверное, здесь упускаю очевидное. Не уверен, связано ли это с этой заметкой (из справочной страницы поиска - в разделе размера):

Размер не учитывает косвенные блоки, но учитывает блоки в разреженных файлах, которые фактически не выделены. Помните, что спецификаторы формата "% k" и "% b" -printf по-разному обрабатывают разреженные файлы. Суффикс 'b' всегда обозначает блоки по 512 байт, а не блоки по 1 килобайту, что отличается от поведения -ls.

1 ответ1

3

2k не эквивалентно 2048c .

Для демонстрации я создал файлы с именами, соответствующими их размеру в байтах:

$ ls -l
total 36
-rw-r--r-- 1 lesmana lesmana 1000 2013-10-03 15:29 s1000
-rw-r--r-- 1 lesmana lesmana 1023 2013-10-03 15:32 s1023
-rw-r--r-- 1 lesmana lesmana 1024 2013-10-03 15:32 s1024
-rw-r--r-- 1 lesmana lesmana 1025 2013-10-03 15:32 s1025
-rw-r--r-- 1 lesmana lesmana 2000 2013-10-03 15:29 s2000
-rw-r--r-- 1 lesmana lesmana 2047 2013-10-03 15:37 s2047
-rw-r--r-- 1 lesmana lesmana 2048 2013-10-03 15:37 s2048
-rw-r--r-- 1 lesmana lesmana 2049 2013-10-03 15:37 s2049
-rw-r--r-- 1 lesmana lesmana 3000 2013-10-03 15:29 s3000

Вот команда dd я использовал для создания файлов:

dd if=/dev/zero of=filename bs=1 count=filesizeinbytes

Заметим:

$ find -size 2048c
./s2048
$ find -size 2k
./s2000
./s1025
./s2047
./s2048

а также:

$ find -size 1024c
./s1024
$ find -size 1k
./s1023
./s1000
./s1024

Логика -size 2048c означает, что все файлы с размером в байтах равны 2048. Логика -size 2k означает, что все файлы с размером, округленным до следующего килобайта, равны 2

Соблюдайте дальше:

$ find -size -2k
./s1023
./s1000
./s1024
$ find -size -2048c
./s2000
./s1023
./s1025
./s2047
./s1000
./s1024

Логика -size -2048c - это любой файл, размер которого в байтах меньше 2048. Логика -size -2k - это любой файл, размер которого округляется до следующего килобайта меньше 2.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .