Почему удаление из командной строки занимает значительно меньше времени, чем из графического интерфейса?

26

Что-то, о чем я задумывался, когда удалял с моего компьютера дюжину или около того изображений: с помощью быстрой rm -rfкоманды на содержимом каталога все изображения сразу исчезли. Когда я перетаскиваю те же самые дюжины или около того изображений в корзину для мусора / бан, это иногда занимает 10 секунд или больше.

Теперь я уверен, что некоторые из них происходят из-за накладных расходов графического интерфейса и тому подобного, и некоторые из них могут заключаться в том, что файл все еще «существует» в некоторой форме, если он помещен в корзину, но есть ли что-нибудь еще, что объясняет такое огромное временное неравенство? Являются ли "rm" и "delete" просто такими принципиально разными командами, поэтому я пытаюсь сравнить яблоки и апельсины?

Джордан План
источник
1
Это верно и для окон, предположительно по тем же причинам, которые приведены ниже.
Крис Х

Ответы:

38

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

$ rm -rf 

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

Сначала графический интерфейс сканирует все дерево, чтобы выяснить, что там есть (поэтому он знает, сколько нужно сделать, чтобы нарисовать симпатичную полосу), затем он повторяется через дерево, снова перемещая файлы из текущего местоположения в местоположение файлы корзины для вашего конкретного графического интерфейса. Это перемещение занимает больше времени, так как необходимо сначала сгенерировать новое уникальное имя файла, связать файл в папке корзины, затем отсоединить его от текущей папки и обновить индекс того, откуда пришли файлы, чтобы их можно было «отменить» - много операций вместо одной.

Например, в Gnome 3 файлы перемещаются в папку:

~/.local/share/Trash/files/<filename>[.<version>]

Где filename- исходное имя файла и versionинкрементный номер версии, чтобы обеспечить уникальность файла (первый экземпляр файла не имеет номера версии). С этим связан .trashinfoфайл, хранящийся в папке:

~/.local/share/Trash/info/<filename>[.<version>].trashinfo

Этот файл содержит исходный путь к файлу до удаления, а также дату и время удаления этого файла.

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

Ничего из этого не делается с помощью простой rmили mvкоманды.

Majenko
источник
1
Эй, кто удалил все комментарии? Мы просто выяснили, что этот ответ может быть неправильным. По крайней мере trash-cli, кажется, не делать это рекурсивно. При удалении папки действительно ли Gnome 3 помещает .trashinfoфайл рекурсивно для каждой подпапки и всех содержащих ее файлов?
mb21
Думаю, для них это слишком шумно! ;-)
Джордан План