Почему перемещение некоторых файлов в папке занимает больше времени, чем перемещение всей папки?

Удалите {} из mv, mv возьмет его в качестве целевого каталога, игнорируя любые родительские каталоги:

find -type f -exec mv {} collection/ \;
1
задан 6 July 2016 в 14:44

7 ответов

Он все равно будет медленным, потому что, как уже отмечалось, файловая система должна повторно привязать каждое имя файла к его новому местоположению.

Однако вы можете ускорить его с того, что у вас есть. [!d1 ]

Ваша команда find запускает один раз для каждого файла. Таким образом, он запускает команду mv 12 миллионов раз для 12 миллионов файлов. Это можно улучшить двумя способами.

Добавить плюсы в конец: find -maxdepth 1 -name '*.jpg' -exec mv -t ../../dst/ + Проверьте man-страницу, чтобы убедиться, что она поддерживается в вашей версии find. Эффект должен состоять в том, чтобы запустить серию команд mv с таким количеством имен файлов, которое будет соответствовать каждой командной строке. Используйте find и xargs вместе. find -maxdepth 1 -name '*.jpg' -print0 | xargs -0 mv -t ../../dst/ -print0 будет использовать NUL, иначе нулевые байты, чтобы отделить имена файлов. Этот плюс xargs -0 устраняет любые проблемы, которые xargs в противном случае имели бы пробелы в именах файлов. Команда xargs будет считывать список имен файлов из команды find и запускать команду mv на столько имен файлов, сколько будет соответствовать.
13
ответ дан 23 May 2018 в 10:32

Ваша путаница происходит из абстракции файловой системы, из-за чего вы считаете, что папка содержит файлы и другие папки в виде дерева. На самом деле это не так: все файлы и каталоги в файловой системе расположены на одном уровне и идентифицируются с номерами определенного типа, в зависимости от реализации. Каталоги - это просто специальные файлы, содержащие списки других файлов.

Когда вы «перемещаете» файлы внутри файловой системы, фактические файлы никуда не денутся.

mv src ../dst перемещает одну запись списка из каталога . в каталог ../dst, поэтому она быстрая.

[ f4] должен перемещать миллионы записей, поэтому он медленнее. Его можно ускорить, если вы вызываете mv только один раз, а не один раз в файл, а сама команда mv может быть оптимизирована для перемещения нескольких записей каталога за один шаг, но нет способа сделать это так быстро, как при перемещении одного каталога.

7
ответ дан 23 May 2018 в 10:32

Упрощенный ответ

перемещение файла выполняется 3 шага:

Добавить () ссылку на файл в список индексных дескрипторов целевой папки, проверьте, была ли ссылка успешно добавила remove () ссылку из списка inodes исходной папки, если проверка выше была успешной.

этот процесс тот же для файла или папки. и, очевидно, это делается для 1 файла на 100 быстрее, чем для 100 файлов.

man link - это add () man unlink is remove () mv просто использует эти две команды выше и добавляет проверку между ними, чтобы предотвратить потерю данных.

4
ответ дан 23 May 2018 в 10:32

Упрощенный ответ

перемещение файла выполняется 3 шага:

Добавить () ссылку на файл в список индексных дескрипторов целевой папки, проверьте, была ли ссылка успешно добавила remove () ссылку из списка inodes исходной папки, если проверка выше была успешной.

этот процесс тот же для файла или папки. и, очевидно, это делается для 1 файла на 100 быстрее, чем для 100 файлов.

man link - это add () man unlink is remove () mv просто использует эти две команды выше и добавляет проверку между ними, чтобы предотвратить потерю данных.

4
ответ дан 23 May 2018 в 10:32

Упрощенный ответ

перемещение файла выполняется 3 шага:

Добавить () ссылку на файл в список индексных дескрипторов целевой папки, проверьте, была ли ссылка успешно добавила remove () ссылку из списка inodes исходной папки, если проверка выше была успешной.

этот процесс тот же для файла или папки. и, очевидно, это делается для 1 файла на 100 быстрее, чем для 100 файлов.

man link - это add () man unlink is remove () mv просто использует эти две команды выше и добавляет проверку между ними, чтобы предотвратить потерю данных.

4
ответ дан 23 May 2018 в 10:32

Упрощенный ответ

перемещение файла выполняется 3 шага:

Добавить () ссылку на файл в список индексных дескрипторов целевой папки, проверьте, была ли ссылка успешно добавила remove () ссылку из списка inodes исходной папки, если проверка выше была успешной.

этот процесс тот же для файла или папки. и, очевидно, это делается для 1 файла на 100 быстрее, чем для 100 файлов.

man link - это add () man unlink is remove () mv просто использует эти две команды выше и добавляет проверку между ними, чтобы предотвратить потерю данных.

4
ответ дан 23 May 2018 в 10:32

Упрощенный ответ

перемещение файла выполняется 3 шага:

Добавить () ссылку на файл в список индексных дескрипторов целевой папки, проверьте, была ли ссылка успешно добавила remove () ссылку из списка inodes исходной папки, если проверка выше была успешной.

этот процесс тот же для файла или папки. и, очевидно, это делается для 1 файла на 100 быстрее, чем для 100 файлов.

man link - это add () man unlink is remove () mv просто использует эти две команды выше и добавляет проверку между ними, чтобы предотвратить потерю данных.

4
ответ дан 23 May 2018 в 10:32

Другие вопросы по тегам:

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