Sei que qualquer pergunta perguntando como excluir arquivos deve ser feita com muito cuidado. Minha primeira resposta foi muito apressada. Não aceitei o fato de que a lista de arquivos poderia estar malformada para ser usada com o egrep. Eu editei a resposta para reduzir esse risco.
Isso deve funcionar para os arquivos que não têm espaço no nome:
Primeiro recrie sua lista de arquivos para garantir o nome exato do arquivo:
sed -e 's,^,^,' -e 's,$,$,' filelist > newfilelist
construir os comandos rm
cd your_directory
ls | egrep -vf newfilelist | xargs -n 1 echo rm > rmscript
Verifique se o script rm combina com você (você pode fazê-lo com "vim" ou "less").
Em seguida, execute a ação:
sh -x rmscript
Se os arquivos tiverem espaços em seu nome (se os arquivos tiverem "
o nome, isso não funcionará):
ls | egrep -vf newfilelist | sed 's,^\(.*\)$,rm "\1",' > rmscript
é claro que a lista de arquivos não deve estar no mesmo diretório!
EDITADO:
A lista de arquivos do Nathan continha nomes que correspondiam a todos os arquivos no diretório (como "html" corresponde a "bob.html"). Portanto, nada foi excluído porque egrep -vf
absorveu todo o fluxo. Eu adicionei um comando para colocar um "^" e um "$" em torno de cada nome de arquivo. Eu tive sorte aqui que a lista de arquivos de Nathan estava correta. Se o DOS estivesse formatado com linhas terminadas CR-LF ou com espaços adicionais, nenhum arquivo seria preservado pelo egrep e todos seriam excluídos.
ls
fornece os nomes dos arquivos de diretório,egrep -vf filelist
filtre seus 50 nomes de arquivos. Receio que você excluiu todos os seus arquivos.Pré-construa os argumentos para
find
:Use as
echo
peças para ver o que seria construído. Remova asecho
peças para realmente executá-lo.Atualização: Demonstração:
fonte
'
) devam ser adicionadas, iekeep=( -name \'"$REPLY"\' )
ekeep+=( -o -name \'"$REPLY"\' )
.Com
zsh
:Ele lê as linhas de
filelist
em uma matriz e, em seguida, usa qualificadores /e
string glob para selecionar / selecionar apenas os nomes de arquivos que não estão presentes na matriz:.
seleciona apenas arquivos regulares (adicioneD
se sua lista contém arquivos de ponto) e o negado^e_'expression'_
ainda seleciona apenas aqueles para que a expressão retorna false, ou seja, se o nome ($REPLY
) não for um elemento da matriz .Se você estiver satisfeito com o resultado, substitua
print -rl
porrm
para remover os arquivos:Para selecionar e remover arquivos recursivamente, use o
*/**
glob com${REPLY:t}
modificador glob:fonte
Se você colocar o conteúdo do diretório em um arquivo como este:
Abra a lista de arquivos com um editor de texto e remova todos os arquivos, exceto os que você deseja excluir . Está em negrito porque é a abordagem oposta à resposta acima
Tente o seguinte:
Se você vir sua lista de arquivos enviados para a tela, substitua eco
rm -v
por:fonte
Execute o script abaixo.
all_files
.not_to_be_deleted_files
).not_to_be_deleted_files
e,files_to_be_deleted
ao finalnot_to_be_deleted_files
, precisamos desses 2 arquivos.join
comando linux e redirecionando a saída para ofiles_to_be_deleted
arquivo.files_to_be_deleted
e removendo os arquivos mencionados nesse nome.O script é como abaixo.
PS : Provavelmente, se você deseja que isso seja salvo como um script e executá-lo, você pode adicionar o nome do script também usando
echo scriptname >> not_to_be_deleted_files
.Embora não seja obrigatório, prefiro fazê-lo porque não haverá arrependimentos mais tarde. Eu testei para um pequeno conjunto de arquivos e funcionou no meu sistema. No entanto, se você quiser ter certeza, tente
test
primeiro um diretório e remova os arquivos no diretório original.fonte
fonte
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-l
opção decp
. Isso ocupa quase nenhum espaço e é muito rápido. Além disso, como eu precisava preservar a estrutura de diretórios, usei a--parents
opçãoAqui está um trecho da minha lista de arquivos:
Portanto, uma linha de exemplo seria, com temp sendo o destino:
Isso criará esta estrutura:
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:
Agora, presumindo que você já tenha criado o diretório vazio / some / where / temp, é possível copiar os arquivos assim:
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.
fonte
Seguro, simples.
cd
para o diretório.Crie um diretório temporário.
feito.
fonte