Fui para uma abordagem mais segura e muito, muito mais rápida porque tinha 18.000 arquivos na lista! Eu precisava limpar as imagens em uma instalação grande do Drupal.
Excluir todos os arquivos que não estão na lista é o mesmo que manter apenas os que estão na lista. Então, decidi copiar os arquivos da lista para outro local, mas copiar 20 GB de arquivos ocuparia muito espaço e também seria muito lento. Portanto, o truque é copiar os arquivos como alternativa hardlinks, usando a -lopção de cp. Isso ocupa quase nenhum espaço e é muito rápido. Além disso, como eu precisava preservar a estrutura de diretórios, usei a --parentsopção
Aqui está um trecho da minha lista de arquivos:
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
Portanto, uma linha de exemplo seria, com temp sendo o destino:
cp -l --parents 'misc/feed.png' temp
Isso criará esta estrutura:
temp
misc
feed.png
Observe que o destino deve estar no mesmo sistema de arquivos que a fonte para os hardlinks funcionarem.
O próximo passo é construir o script:
sed -e "s,^,cp -l --parents '," -e "s,$,' /some/where/temp," filelist > newfilelist
Agora, presumindo que você já tenha criado o diretório vazio / some / where / temp, é possível copiar os arquivos assim:
sh newfilelist 2> missing_files
Observe como os erros terminam em missing_files. O bônus adicional dessa abordagem é que você obterá uma lista de arquivos da lista original que realmente não existem!
Após a execução do script, o temp conterá apenas os arquivos que estão na lista de arquivos, mas sem excluir nada e sem ocupar espaço adicional. Se você estiver satisfeito com o resultado, poderá excluir todos os arquivos originais, incluindo as subpastas.
Por fim, mova os arquivos e pastas de temp novamente para o local original.
Para os 18.000 arquivos, foram necessários apenas alguns segundos.