Wybrałem bezpieczniejsze i znacznie szybsze podejście, ponieważ miałem na liście 18 000 plików! Musiałem wyczyścić obrazy w dużej instalacji Drupala.
Usunięcie wszystkich plików, których nie ma na liście, jest tym samym, co zachowanie tylko tych, które są na liście. Postanowiłem więc skopiować pliki z listy do innej lokalizacji, ale skopiowanie 20 GB plików zajęłoby zbyt dużo miejsca i byłoby bardzo powolne. Sztuką jest więc skopiowanie plików hardlinks
zamiast tego, używając -l
opcji cp
. To nie zajmuje prawie miejsca i jest bardzo szybkie. Dodatkowo, ponieważ musiałem zachować strukturę katalogów, skorzystałem z tej --parents
opcji.
Oto fragment mojej listy plików:
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
Przykładem może być wiersz z tempem jako miejscem docelowym:
cp -l --parents 'misc/feed.png' temp
Spowoduje to utworzenie tej struktury:
temp
misc
feed.png
Zauważ, że miejsce docelowe musi znajdować się w tym samym systemie plików co źródło twardych dowiązań do działania.
Następnym krokiem jest zbudowanie skryptu:
sed -e "s,^,cp -l --parents '," -e "s,$,' /some/where/temp," filelist > newfilelist
Teraz, zakładając, że utworzyłeś już pusty katalog / some / where / temp, możesz skopiować pliki w następujący sposób:
sh newfilelist 2> missing_files
Zwróć uwagę, w jaki sposób błędy się kończą missing_files
. Dodatkową zaletą tego podejścia jest to, że otrzymasz listę plików z oryginalnej listy, które tak naprawdę nie istnieją!
Po uruchomieniu skryptu temp będzie zawierać tylko te pliki, które znajdują się na liście plików, ale bez usuwania czegokolwiek i bez zajmowania dodatkowego miejsca. Jeśli wynik jest zadowalający, możesz usunąć wszystkie oryginalne pliki, w tym podfoldery.
Na koniec przenieś pliki i foldery z temp z powrotem do pierwotnej lokalizacji.
W przypadku 18 000 plików zajęło to tylko kilka sekund.