6

У меня машина под управлением Debian Squeeze с apache, mysql, php ... В одном из каталогов есть несколько других каталогов и слишком много файлов больше, чем 500k файлов, я пытался удалить через WinSCP, но он зависает. Даже после более чем 24 часов WinSCP по-прежнему не отвечает. В данный момент я пытаюсь удалить этот каталог с помощью Putty (rm -rf dirname), но так же, как и WinSCP, он перестал отвечать. Какие-либо предложения? Спасибо!

У меня есть root-доступ к машине.

2 ответа2

4

Удаление каталога должно работать. Вы можете столкнуться с проблемами, если вы пытаетесь удалить отдельные файлы, потому что их так много. Вы не используете rm -rf dirname/* вы?

Я предполагаю, что вы теряете соединение ssh из-за неактивности, вы уверены, что команда не была выполнена правильно на сервере?

В любом случае, возможный обходной путь - использовать nohup:

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

Итак, для удаления ~ 2 миллионов пустых файлов потребовалось 20 минут. Кажется разумным, что может потребоваться несколько часов, чтобы удалить огромное количество непустых файлов.

В любом случае, некоторые из предложений по вопросу 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

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

0

Как сторона не до ответа уже выложена. Из моего опыта работы с файловой системой, в которой закончились inode. В файловой системе более миллиарда файлов.

Самый быстрый способ удалить / перечислить файлы - это найти, особенно если у вас есть тысячи файлов / каталогов. Find начинает работать сразу же при условии, что расширение не требуется.

найти / путь / к / быть / удален -type f --delete

Не используйте * или любой другой тип расширения командной строки как часть вашей команды. * выполняется в терминале, прежде чем он будет передан команде rm / ls и т. д. Таким образом, ваш терминал сидит там, пытаясь составить список всех сотен тысяч файлов, прежде чем передать их фактической команде, которая выполнит эту работу. Это очень медленно.

человек баш
...
РАСШИРЕНИЕ
Расширение выполняется в командной строке после того, как оно было разбито на слова. Существует семь видов выполняемых расширений: расширение скобок, расширение тильды, расширение параметров и переменных, подстановка команд, арифметическое расширение, разбиение слов и расширение имени пути.
...

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .