Из любопытства, почему намного быстрее удалить папку / папки в Linux (я использую Ubuntu) через SSH, вызвав rm -rf somefolder
чем удалять папку из GUI (щелкните правой кнопкой мыши, затем «Перейти в корзину»)? Папки, которые я удаляю, содержат около 100 файлов изображений, и, вероятно, потребуется несколько минут, чтобы удалить папки в графическом интерфейсе, тогда как rm -rf запускается мгновенно. Достигают ли два действия одного и того же эффекта, или rm -rf
только удаляет ссылку на файлы?
2 ответа
Вы не указали это в своем вопросе, но я подозреваю, что ваш графический интерфейс основан на какой-то функции файловой системы поверх ssh. Это может замедлить процесс, поскольку каждая операция низкого уровня (открытый каталог, чтение каталога, удаление файла1, удаление файла2, ... закрытие каталога) передается по каналу ssh в виде отдельной команды.
Когда вы запускаете rm -rf x
из приглашения оболочки на удаленном компьютере, единственное, что передается по сети, - это нажатия клавиш, которые вы использовали для ввода rm -rf x
и Enter. (Они действительно раздуты заголовками сетевых протоколов, но они все еще достаточно малы.) Операции низкого уровня выполняются программой rm
на удаленном конце, напрямую обращаясь к ядру на удаленном конце, поэтому, естественно, это быстрее.
ssh был разработан для обеспечения интерфейса оболочки (имя должно быть подсказкой). Другие вещи, прикрепленные к нему, менее эффективны.
Для реализации filemanager-over-ssh было бы возможно оптимизировать случай рекурсивного удаления и просто попросить сервер запустить rm -rf
. Я не знаю, сделал ли кто-нибудь из них это.
Вы подключаетесь к удаленной системе с помощью файлового менеджера "nautilus" или аналогичного, используя URL-адрес ssh:// с протоколом sftp.
Моя версия nautilus отказывается перемещать такой удаленный каталог в локальную корзину. Перемещение удаленного дерева каталогов в локальный мусор будет медленным, ему придется загрузить все файлы перед их удалением.
Мой наутилус просто удаляет файлы. Протокол sftp не имел никакой функции «рекурсивного удаления» до начала этого года (2012 R1). Вы не используете эту более новую систему sftp, и nautilus, вероятно, еще не знает об этом. Таким образом, файловый менеджер должен перечислить все файлы и удалять их по одному. Он получает сообщение с подтверждением для каждого файла, что удаление было выполнено, прежде чем перейти к следующему файлу. Таким образом, минимальное время для удаления файла похоже на ваше обычное время проверки связи с сервером (или хуже).
Это одноразовое удаленное удаление намного медленнее, чем запуск rm -rf /whatever
или даже rm -vrf /whatever
по обычному ssh-соединению. Я удаляю исходный код gcc в качестве контрольного примера, и для этих 28300 файлов требуется около 40 минут. nautilus использует только 2% CPU, поэтому он явно не привязан к CPU при рисовании GUI.
Проблема не имеет ничего общего с GUI, это связано с недостатком (старого) протокола sftp: нет рекурсивной функции удаления. Но именно поэтому я использую командную строку! Ни один уважающий себя хакер не подождет 40 минут!
Файловый менеджер может удалять файлы достаточно быстро, показывая, какие файлы удаляются, если он использовал что-то вроде rm -vrf /whatever
. Некоторые серверы предоставляют sftp-доступ, но не полный ssh-доступ. Наутилус, кажется, принимает худшее и использует только sftp.