У меня есть машина, на которой запущен Debian Squeeze с Apache, MySQL, PHP... В одном из каталогов есть несколько других каталогов и слишком много файлов, более 500 тыс. файлов, я попытался удалить через WinSCP, но он завис. Даже спустя более 24 часов WinSCP все еще не отвечает. В данный момент я пытаюсь удалить этот каталог с помощью Putty (rm -rf dirname), но, как и WinSCP, он перестал отвечать. Есть какие-нибудь предложения? Спасибо!
У меня есть root-доступ к машине.
решение1
Удаление каталога должно сработать. Вы можете столкнуться с проблемами, если попытаетесь удалить отдельные файлы, потому что их так много. Вы ведь не работаете rm -rf dirname/*
?
Я предполагаю, что вы теряете SSH-соединение из-за бездействия. Вы уверены, что команда не была выполнена правильно на сервере?
В любом случае возможным решением было бы использованиенет:
nohup rm -rf dirname
Вы можете запустить команду и выйти из системы, она продолжит работу в фоновом режиме.
ОБНОВЛЯТЬ:
я нашелэтот вопросна U&L.SE, я рекомендую вам взглянуть на него. К сожалению, я не могу воссоздать вашу проблему. Я создал каталог с 2516007 файлами и всегда могу удалить его с помощью rm -rf
:
$ mkdir ha
$ for X in $(seq 1 10000);do touch {1..10000}_$X; done
$ ls -f ha | wc -l
2516007 <= I stopped before the for loop finished, but this should be enough
$ time rm -rf ha/
real 23m11.695s
user 0m3.540s
sys 0m42.891s
Итак, потребовалось 20 минут, чтобы удалить ~2 миллиона пустых файлов. Кажется разумным, что удаление огромного количества непустых файлов может занять часы.
В любом случае, некоторые предложения из вопроса U&L должны помочь. В частности, это:
find /delb -type f --delete
или этот (немного измененный по сравнению с оригиналом)
find /delb -type f -print0 | xargs -0r rm -f
Наконец, трюк, который вы можете сделать, это удалить несколько файлов за раз. Если вы знаете, что некоторые имена файлов начинаются со строки "foo", другие "bar" и т. д., сделайте следующее:
rm -rf /delb/foo*
rm -rf /delb/bar*
и т. д. Вы также можете попробовать что-то вроде этого:
for n in {a..z}; do rm -rf /delb/$n*; done
for n in {A..Z}; do rm -rf /delb/$n*; done
for n in {0..9}; do rm -rf /delb/$n*; done
Последняя команда последовательно удалит все имена файлов, начинающиеся с каждой буквы алфавита, а затем все имена файлов, начинающиеся с цифр.
решение2
В качестве дополнения к уже опубликованному ответу. Из моего опыта работы с файловой системой, в которой закончились иноды. С более чем миллиардом файлов в файловой системе.
Самый быстрый способ удалить/перечислить файлы — использовать find, особенно если у вас тысячи файлов/каталогов. Find начинает работать немедленно, если нет необходимости в расширении.
найти /путь/к/удалению -type f --delete
Не используйте *
или любой другой тип расширения командной строки как часть вашей команды. *
выполняется в терминале до того, как будет передана команде rm / ls и т. д. Поэтому ваш терминал сидит там, пытаясь перечислить все сто тысяч файлов, прежде чем передать их фактической команде, которая выполнит работу. Это очень медленно.
man bash
...
РАСШИРЕНИЕ
Расширение выполняется в командной строке после ее разделения на слова. Существует семь видов выполняемого расширения: расширение фигурных скобок, расширение тильды, расширение параметров и переменных, подстановка команд, арифметическое расширение, разделение слов и расширение имени пути.
...