Eu preciso limpar uma pasta periodicamente. Recebo uma lista de arquivos que contém texto, quais arquivos são permitidos. Agora eu tenho que excluir todos os arquivos que não estão neste arquivo.
Exemplo:
dont-delete.txt
:
dontdeletethisfile.txt
reallyimportantfile.txt
neverdeletethis.txt
important.txt
Minha pasta de limpeza contém isso como exemplo:
ls /home/me/myfolder2tocleanup/
:
dontdeletethisfile.txt
reallyimportantfile.txt
neverdeletethis.txt
important.txt
this-can-be-deleted.txt
also-waste.txt
never-used-it.txt
Portanto, esses arquivos devem ser excluídos:
this-can-be-deleted.txt
also-waste.txt
never-used-it.txt
Eu procuro algo para criar um comando de exclusão com uma opção para excluir alguns arquivos fornecidos por arquivo.
command-line
bash
scripts
rm
stefan83
fonte
fonte
Respostas:
O
rm
comando é comentado para que você possa verificar e verificar se está funcionando conforme necessário. Depois, desmarque essa linha.A
check directory
seção garantirá que você não execute o script acidentalmente do diretório errado e bloqueie os arquivos errados.Você pode remover a
echo deleting
linha para executar silenciosamente.fonte
ls
e a captura inútil da saída,grep
se tudo o que você deseja saber é se houve uma correspondência ou não. Eu também usei padrões de cadeia fixa para evitar problemas de escape.while
loop para umfor
loop, alterou inadvertidamente oiteration key
dei
paraf
. na declaração, que quebrou o código. Eu consertei isso.f
. ;-P (... e um para a sua resposta, que eu esqueci anteriormente.)Este script python pode fazer isso:
Parte importante é descomentar a
os.unlink()
função.NOTA : adicione esse script e
dont-delete.txt
ao seudont-delete.txt
para que ambos estejam na lista e mantenha-os no mesmo diretório.fonte
set
lista em vez de uma lista para pesquisa O (1) em vez de O (n) na segunda parte.Aqui está uma frase:
ls
imprime todos os arquivos no diretório atual (em ordem classificada)sort dont_delete
imprime todos os arquivos que não queremos excluir na ordem classificada<()
operador transforma uma string em um objeto parecido com um arquivocomm
comandos comparam dois arquivos pré-classificados e imprimem linhas nas quais eles diferem-2 -3
sinalizadores fazcomm
com que apenas as linhas contidas no primeiro arquivo sejam impressas, mas não no segundo, que será a lista de arquivos seguros para excluirtail +2
chamada é apenas para remover o cabeçalho dacomm
saída, que contém o nome do arquivo de entradaxargs
qual transformará o fluxo de saída em uma lista de argumentos pararm
. A-p
opção obrigaxargs
a pedir confirmação antes de executar.fonte
Parece que você pode fazer isso nativamente
zsh
usando o(+cmd)
qualificador glob.Para ilustrar, vamos começar com alguns arquivos
e um arquivo de lista de permissões
Primeiro, leia a lista de permissões em uma matriz:
ou talvez melhor
(o equivalente ao
mapfile
built-in do bash - ou seu sinônimoreadarray
). Agora podemos verificar se existe uma chave (nome do arquivo) na matriz usando o${keepfiles[(I)filename]}
que retorna 0 se nenhuma correspondência for encontrada:Podemos usar isso para criar uma função que retorna
true
se não houver correspondências$REPLY
no array:Finalmente, usamos esta função como um qualificador em nosso comando:
ou, no seu caso
(Você provavelmente adicionará o nome do arquivo da lista de permissões à própria lista de permissões.)
fonte
Supondo que seu shell bash esteja ativado
extglob
shopt
, aqui está uma alternativa um pouco mais conservadora:(... acompanhando a excelente sugestão de comunicação de @ gardenhead!)
fonte
Supondo que não haja espaço em branco (espaços / guias) nos seus arquivos listados em um arquivo chamado
list
, você faria:Basta adicionar
-delete
ao comando acima para excluir os arquivos que não existem no arquivo de lista . Se o seu achado não tem-delete
opção, você pode usarrm
com-exec
as seguintes:Ou usando
-exec
com+
terminador .echo
é usado apenas para executar a seco.fonte
A menos que a saída
ls /home/me/myfolder2tocleanup/
exceda o limite máximo de argumentos do shell,ARG_MAX
que é de cerca de 2 MB para o Ubuntu, sugiro o seguinte.Uma implementação de comando de uma linha que fará o trabalho seria a seguinte:
dont-delete.txt
arquivo para o diretório que contém os arquivos a serem excluídos da seguinte maneira:cd
para o diretório que contém os arquivos a serem excluídos da seguinte forma:fonte
Minha sugestão é:
Atualização 2018-08-07
Exemplo:
Observe que após a linha 3 você terá o
dont-delete.txt
arquivo com o conteúdo:(a liderança
./
é muito importante )Os arquivos
c
ed
serão excluídos.fonte