Я пошел к более безопасному и намного более быстрому подходу, потому что у меня было 18 000 файлов в списке! Мне нужно было очистить изображения в большой установке Drupal.
Удаление всех файлов, которых нет в списке, равнозначно сохранению только тех, которые находятся в списке. Поэтому я решил скопировать файлы из списка в другое место, но копирование 20 ГБ файлов заняло бы слишком много места и также было бы очень медленным. Таким образом, хитрость заключается в том, чтобы скопировать файлы hardlinks, используя вместо этого, используя -lпараметр cp. Это почти не занимает места и очень быстро. Кроме того, поскольку мне нужно было сохранить структуру каталогов, я использовал эту --parentsопцию.
Вот выдержка из моего списка файлов:
1px.png
misc/feed.png
modules/file/icons/x-office-presentation.png
modules/file/icons/x-office-spreadsheet.png
newsletter.png
sites/all/libraries/ckeditor/plugins/smiley/images/devil_smile.png
sites/all/libraries/ckeditor/plugins/smiley/images/regular_smile.png
sites/default/files/009313_PwC_banner_CBS_Observer_180x246px.jpg
Таким образом, пример строки будет с temp, являющейся местом назначения:
cp -l --parents 'misc/feed.png' temp
Это создаст эту структуру:
temp
misc
feed.png
Обратите внимание, что назначение должно быть в той же файловой системе, что и источник для работы жестких ссылок.
Следующим шагом является создание сценария:
sed -e "s,^,cp -l --parents '," -e "s,$,' /some/where/temp," filelist > newfilelist
Теперь, предполагая, что вы уже создали пустой каталог dir / some / where / temp, вы можете скопировать файлы следующим образом:
sh newfilelist 2> missing_files
Обратите внимание, как ошибки заканчиваются missing_files. Дополнительным бонусом этого подхода является то, что вы получите список файлов из исходного списка, которые на самом деле не существуют!
После запуска скрипта temp будет содержать только те файлы, которые есть в списке файлов, но ничего не удаляя и не занимая дополнительное место. Если вы удовлетворены результатом, вы можете удалить все оригинальные файлы, включая подпапки.
Наконец, переместите файлы и папки из временного каталога обратно в исходное местоположение.
Для 18 000 файлов это заняло всего несколько секунд.