remove arquivos baseados em diff de dois arquivos de texto

1

Eu criei dois arquivos .txt parecidos com:

5fba026dcf271c6fa174b9fc2fc1fefadf1370f9 ./.changeFiles/change/addImage1.change  
bb352fba5807f4d03ea11abb00e411b00ce38673  ./.changeFiles/change/addImage2.change  
999eea42e4e72431695815456a3ac16796df5eed  ./.changeFiles/change/addSurface1.change

Uma é uma lista de todos os arquivos que terminam com .change ou .tstwf no diretório determinado e a outra é uma versão ordenada dessa lista com entradas duplicadas (baseadas no shasum) removidas.

Quando eu uso um colordiff -u nos dois arquivos, todas as mudanças são os arquivos que eu quero remover. Existem centenas de arquivos a serem removidos e eu preferiria não ter que fazer isso manualmente ...

Então, minha pergunta é: Como eu removo os arquivos do diretório que não estão incluídos no sorted.txt e aparecem no diff?

Editar1:

workflows.txt (arquivo original):

23ded53098d5d233c0a54af482542ba7a42860d3  ./encryption/AFPtoPDFwEncryption.tstwf
24a37e00de73a58736be1aee56d4b073e75a994f  ./workflows-from-will/workflow/AFPtoPDF.tstwf
2532934d268bb6eddc6a018e3469b0a53a794e10  ./workflows-from-will/workflow/change/table.without.emptycells.rotation.270.mark-content.change
264a08fef59d9b9c18a857e2532f0b7b5a92c60b  ./pageModification/AFPtoPDFwFillRectMod1.tstwf
2680a37bb22512bf3119e3991bb2c814cb23fb77  ./workflows-from-will/workflow/AFPtoPDFwHyperlinks.tstwf
268635261e91a4caf1a09979ffdb8163d4d22c8a  ./AFPmicr.tstwf
268635261e91a4caf1a09979ffdb8163d4d22c8a  ./workflows-from-will/eds-0923/AFPmicr.tstwf

workflows-sorted.txt (lista de todos os arquivos desse tipo a serem mantidos):

0bdbcbed279e2df9149de319253609f11b19d689  ./textModification/AFPtoPDFwReplaceTextMod2.tstwf
0d0ebfb8d519ff84e3dd86771d067bdeea835df6  ./pageModification/AFPtoPDFwSoftClipMod1.tstwf
0dcafe876ea8574619664920ec5b1fdbff3ca218  ./workflows-from-will/AFPtoPDF_CE003A01.tstwf
0e55506bf5d7694d8cda9467a5809ea75c486fb1  ./workflows-from-will/workflow/change/pdf.change
0ec03992e19a12520f131f89cd9060c2e4ba2be2  ./workflows-from-will/AFPNOPIndexCallback.tstwf
0f1dca3e5d9b17f11c194b250096fc15891b9998  ./stapling/AFPtoPDFwStapling1.tstwf

Além disso, na minha pesquisa eu me deparei com o comando "comm" parece que isso poderia ser usado para isolar os arquivos que eu quero remover.

    
por Zak 31.12.2015 / 19:05

3 respostas

0

Portanto, você deseja remover os arquivos listados em workflows.txt , exceto aqueles listados em workflows-sorted.txt . Você pode obter a lista de arquivos retirando as somas de verificação, classificando os nomes e executando comm para extrair o linhas que estão presentes apenas em workflows.txt . Em um shell que suporta a substituição de processos (ksh93, bash, zsh):

comm -23 <(<workflows.txt sed 's/^[^ ]*[ ][ ]*//' | sort) \
         <(workflows-sorted.txt sed 's/^[^ ]*[ ][ ]*//' | sort)

comm -23 remove as linhas que estão presentes apenas no segundo argumento ( -2 ) e as linhas que estão presentes nos dois arquivos ( -3 ), mantendo apenas as linhas que estão presentes no primeiro argumento, mas não o segundo argumento. Tenha em mente que comm requer que os arquivos de entrada sejam classificados.

Para excluí-los:

comm -23 <(<workflows.txt sed 's/^[^ ]*[ ][ ]*//' | sort) \
         <(workflows-sorted.txt sed 's/^[^ ]*[ ][ ]*//' | sort) |
xargs -I rm -- {}

Você pode fazer com que a última linha xargs rm seja um pouco mais rápida (agrupando as chamadas para rm ) se os nomes dos arquivos não contiverem nenhum espaço em branco ou \'" . Alternativamente, você pode fazer a última linha tr '\n' 'xargs -d '\n' rm --' | xargs -0 rm -- ou xargs se o seu -- suportar essas opções. Você não precisa do / se todos os seus nomes de arquivos começarem com ./ ou - (ou qualquer coisa que esteja garantida para não começar com %code% ).

    
por 01.01.2016 / 02:25
0

Se os seus nomes de arquivos não tiverem espaços, isso deve fornecer uma lista dos arquivos repetidos que você deseja apagar:

awk 'c[$1]++' workflows.txt > erasefiles.txt

Então, é só uma questão de apagar todos eles (use o eco primeiro até ter certeza de que isso faz exatamente o que você precisa) (no bash):

rm $(awk '{print $2}' erasefiles.txt)

Se os seus arquivos puderem ter espaços (ou outros caracteres estranhos, exceto a nova linha - \n e zero %code% ):

awk '{$1=""; print}' erasefiles.txt | tr '\n' '
awk 'c[$1]++' workflows.txt > erasefiles.txt
' | xargs -0 -r rm --
    
por 31.12.2015 / 21:07
0

Para um trabalho one off , eu começaria com a saída diff e edite-a em uma lista de arquivos a serem excluídos (se ficar entediado, deixe essa tarefa em sed(1) , Script Perl, ou algo assim). Depois de verificar novamente a lista, execute-a, por exemplo, ( bash(1) !):

rm $(< list-of-files-to-axe)

Pode ser uma época com -f ou -i flags a gosto.

Automatizar isso será muito mais trabalho (e introduzir muitas dicas) para valer a pena para uso ocasional. Para uso repetitivo, escreva tudo em uma linguagem de script capaz, como Perl ou Python. Fique longe de linguagens de propósito especial como awk(1) .

    
por 31.12.2015 / 23:40