Я пішов на більш безпечний і набагато швидший підхід, оскільки в списку було 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 файлів знадобилося лише кілька секунд.