Что + в находке/path/-исполнительная команда '{}' + делает?

(Хм: следующее является теперь чем-то вроде эпопеи...),

Дизайн каталога в файловых системах 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), та функция

  1. создает файл каталога (с некоторым inode числом) с корректной внутренней структурой,
  2. добавляет запись в родительский каталог, отображая название нового каталога к этому новому inode (который составляет одну из ссылок),
  3. добавляет запись в новый каталог, отображая строку '.' на тот же inode (это составляет другую ссылку), и
  4. добавляет другая запись в новый каталог, отображая строку '..' к inode файла каталога это изменило на шаге (2) (это составляет большее число жестких ссылок, на которых Вы будете видеть на файлах каталога, которые содержат подкаталоги).

Конечный результат состоит в том, что (почти) единственные особые случаи:

  • Открытое (2) функция пытается мешать стрелять себе в ногу путем предотвращения Вас вводные файлы каталога для записи.
  • mkdir (2) функция делает вещи хорошими и легкими путем добавления нескольких дополнительных записей (''. и '..') в новый файл каталога, просто для создания удобным переместить файловую систему. Я подозреваю, что файловая система работала бы отлично без'.' и '..', но была бы боль для использования.
  • Файл каталога является одним из нескольких типов файлов, которые отмечаются как 'особенные' - это действительно, что говорит, что вещам нравится, открывают (2) для поведения немного по-другому. Посмотрите st_mode в статистике (2).

(скопированный с stackoverflow исходного вопроса, 20.10.2011)

13
01.11.2010, 14:05
2 ответа

'+' делает одну большую командную строку из всех найденных файлов для уменьшения количества команд, которые будут выполнены.

Учитывая случай, что команда находки находит четыре файла.

find . -type f -exec command '{}' \;

произвел бы

command file1
command file2
command file3
command file4 

С другой стороны,

find . -type f -exec command '{}' \+

производит

command file1 file2 file3 file4
17
27.01.2020, 19:53
  • 1
    Если Вы знаете xargs, -exec … {} + делает то же как -print | xargs …, но без проблем заключения в кавычки (-print0 | xargs -0 иначе, но это менее портативно). –  Gilles 'SO- stop being evil' 01.11.2010, 20:13

Из страницы справочника:

- исполнительная команда {} +

Этот вариант - исполнительное действие выполняет указанную команду на выбранных файлах, но командная строка создается путем добавления каждого выбранного имени файла в конце; общее количество вызовов команды будет намного меньше, чем количество подобранных файлов. Командная строка создается почти таким же способом, которым xargs создает свои командные строки. Только один экземпляр '{}' позволяется в рамках команды. Команда выполняется в начальном каталоге.

4
27.01.2020, 19:53
  • 1
    это очень... кратко? Я нахожу, что этому недостает подробно, и ясность. –  xenoterracide 01.11.2010, 14:54
  • 2
    Идея не состоит в том, чтобы вслепую породить один процесс для каждого файла, но собрать имена файлов и назвать команду меньше раз. Пример: вместо того, чтобы создать 3 различных "процесса" ИМЕНИ ФАЙЛА комнаты, это собирает имена файлов и делает "FILE1 FILE2 FILE3 комнаты". –  tante 01.11.2010, 15:02
  • 3
    IIRC, которым некоторые версии xargs имеют опцию обработать эти имена в пакетном режиме вместе до указанного предела, таким образом, можно извлечь выгоду из этого, но также и постараться не переполняться, когда у Вас есть большой список, также. –  Kevin Cantu 02.11.2010, 04:03
  • 4
    (Находят, сам, является страшным небольшим языком все его собственное!) –  Kevin Cantu 02.11.2010, 04:03
  • 5
    find дает мне полу. –  Matt Alexander 29.01.2011, 23:02

Теги

Похожие вопросы