(Хм: следующее является теперь чем-то вроде эпопеи...),
Дизайн каталога в файловых системах Unix (который, чтобы быть педантичным, обычно, но не обязательно присоединен к OSs Unix) представляет замечательное понимание, которое на самом деле сокращает количество требуемых особых случаев.
'Каталог' является действительно просто файлом в файловой системе. Все фактическое содержание файлов в файловой системе находится в inodes (от Вашего вопроса, я вижу, что Вы уже знаете о части этого материала). Нет никакой структуры к inodes на диске - они - просто большой набор пронумерованных блобов байтов, распространения как арахисовое масло по диску. Это не полезно, и действительно отталкивающе любому с клочком опрятной озабоченности.
Единственный специальный inode является inode номером 2 (не 0 или 1 по причинам Традиции); inode 2 является файлом каталога: корневой каталог. Когда система монтирует файловую систему, она 'знает', что имеет к readdir inode 2, для запущения себя.
Файл каталога является просто файлом с внутренней структурой, которая предназначается, чтобы быть считанной opendir (3) и друзья. Вы видите его внутреннюю структуру, зарегистрированную в dir (5) (в зависимости от Вашей ОС); при рассмотрении этого Вы будете видеть, что запись файла каталога не содержит почти информации о файле - это - все в файле inode. Одна из нескольких вещей, это является особенным об этом файле, - то, что открытое (2) функция будет, учитывая ошибку, при попытке открыть файл каталога с режимом, который разрешает писать. Различные другие команды (для выбора всего одного примера, hexdump
) откажется действовать нормальным способом с файлами каталога, просто потому что это, вероятно, не, что Вы хотите сделать (но это - их особый случай, не файловая система).
Жесткая ссылка - ничто больше, ни меньше, чем запись в карте файла каталога. Вы можете иметь два (или больше) записи в такой карте который обе карты к тому же inode числу: это inode поэтому имеет два (или больше) жесткие ссылки. Это также объясняет, почему каждый файл имеет по крайней мере одну 'жесткую ссылку'. inode имеет подсчет ссылок, который записывает, сколько раз это inode упоминается в файле каталога где-нибудь в файловой системе (это - число, которое Вы видите, когда Вы делаете ls -l
).
Хорошо: мы переходим к сути дела теперь.
Файл каталога является картой строк ('имена файлов') к числам (inode числа). Те inode числа являются числами inodes файлов, которые находятся 'в' том каталоге. Файлы, которые находятся 'в' том каталоге, могли бы включать другие файлы каталога, таким образом, их inode числа будут среди перечисленных в каталоге. Таким образом, если у Вас есть файл /tmp/foo/bar
, затем файл каталога foo
включает запись для bar
, отображение той строки к inode для того файла. В файле каталога существует также запись /tmp
, для файла каталога foo
который находится 'в' каталоге /tmp
.
Когда Вы создаете каталог с mkdir (2), та функция
Конечный результат состоит в том, что (почти) единственные особые случаи:
st_mode
в статистике (2).(скопированный с stackoverflow исходного вопроса, 20.10.2011)
'+' делает одну большую командную строку из всех найденных файлов для уменьшения количества команд, которые будут выполнены.
Учитывая случай, что команда находки находит четыре файла.
find . -type f -exec command '{}' \;
произвел бы
command file1
command file2
command file3
command file4
С другой стороны,
find . -type f -exec command '{}' \+
производит
command file1 file2 file3 file4
Из страницы справочника:
- исполнительная команда {} +
Этот вариант - исполнительное действие выполняет указанную команду на выбранных файлах, но командная строка создается путем добавления каждого выбранного имени файла в конце; общее количество вызовов команды будет намного меньше, чем количество подобранных файлов. Командная строка создается почти таким же способом, которым xargs создает свои командные строки. Только один экземпляр '{}' позволяется в рамках команды. Команда выполняется в начальном каталоге.
xargs
,-exec … {} +
делает то же как-print | xargs …
, но без проблем заключения в кавычки (-print0 | xargs -0
иначе, но это менее портативно). – Gilles 'SO- stop being evil' 01.11.2010, 20:13