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' ' ou xargs -d '\n' rm --' | xargs -0 rm --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% ).