Как удалить много (200 000) файлов?


17

Я должен удалить 200 000 файлов (все они) из папки, и я не хочу удалять саму папку.

используя rm, я получаю сообщение об ошибке «Список аргументов слишком длинный». Я пытался что-то сделать с xargs, но я не парень из Shell, поэтому он не работает:

find -name * | xargs rm -f

5
Почему бы не удалить папку и воссоздать ее после удаления?
garconcn

Ответы:


35
$ find /path/to/folder -type f -delete

15
Вероятно, стоит упомянуть, что GNU find (как используется в большинстве дистрибутивов Linux) может самостоятельно удалять файлы -delete. Это также позволяет избежать проблем с файлами, содержащими кавычки или символы новой строки (хотя вы можете использовать опции GNU find -print0и GNU xarg, -0чтобы это исправить).
DerfK

3
@DerfK, приятное замечание! Кроме того , много ППЛ , как правило, играть с xargsтем findимеет -exec command {} +синтаксис.
Пой

5

Вы все делаете правильно. Это '*' создает проблему (оболочка расширяет ее в список файлов вместо find). Правильный синтаксис может быть:

cd <your_directory>; find . -type f | xargs rm -f
find <your_directory> -type f | xargs rm -f

(Последнее немного менее эффективно, поскольку оно будет передавать более длинные имена xargs, но вы вряд ли заметите :-))

В качестве альтернативы, вы можете экранировать ваш '*' следующим образом (однако в этом случае он также попытается также удалить "." И ".."; это не важная персона - вы просто получите небольшое предупреждение :-)):

find . -name '*' | xargs rm -f
find . -name "*" | xargs rm -f
find . -name \* | xargs rm -f

Если ваши имена файлов содержат пробелы, используйте это:

find . -type f -print0 | xargs -0 rm -f

1
Это не работает, если у вас есть имя файла, содержащее пробел.
user9517

@lain: Да, я только что редактировал свой ответ, чтобы включить трюк для пробелов :-)
dtoubelis


2

можешь попробовать

find /path/to/folder -type f -print0  | xargs -0 rm -f

или

find /path/to/folder -type f -exec rm -f "{}" +

1

Слава к количеству ответа, вот некоторые дополнения.

Если вы хотите удалить файлы с определенным шаблоном имени, вы можете написать это так. Также добавлен -print, чтобы вы могли видеть, что происходит при удалении файлов.

sudo find /home/mydirectory -name "*.jpg" -type f -print -delete

Это, например, удаляет все JPEG в mydirectory.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.