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% ).