Esta resposta toma emprestado liberalmente de alguns comentários. Mande seu amigo correr
dir /b/s/a-d > dir.out
Você corre
find . -print > find.out
Normalize dir.out
e find.out
:
- Torne os finais de linha uniformes (por exemplo, NL ou CRLF),
- Remover prefixos comuns (
C:\Users\…
e./
), - Altere as barras invertidas (
\
) para barras (/
) emdir.out
e - Classifique os dois arquivos.
Agora faça
comm dir.out find.out
(Você pode querer canalizar isso em um pager como more
ou less
.)
A saída consistirá em três colunas:
- Entradas (nomes de arquivos) presentes apenas no primeiro arquivo (
dir.out
). Não deveria haver nenhum; se houver, seu amigo incluiu um arquivo que ele não recebeu de você ou você não normalizou completamente os arquivos. (OK, dependendo exatamente como seu amigo fez o comandodir
, o arquivodir.out
em si pode aparecer na coluna 1.) - Entradas presentes apenas no segundo arquivo (
find.out
). Estes são os nomes dos arquivos que você tem em seu sistema, mas que seu amigo não listou. Em outras palavras, esses são os arquivos que você deseja excluir. - Entradas presentes nos dois arquivos. Isso deve ser o mesmo que
dir.out
.
Se houver falsos negativos devido a diferenças entre maiúsculas e minúsculas ("A" a a "),
tente o comando comm
novamente com uma opção -f
.
Você provavelmente repetirá a opção sort
com -f
.
Agora , digite comm -13 dir.out find.out
. Esta sintaxe incrivelmente danificada pelo cérebro significa
"Me dê toda a saída normal, exceto para as colunas 1 e 3", em outras palavras, apenas a coluna de saída 2. Como indicado acima, esta é a lista de arquivos que você deseja excluir,
então canalize-o em xargs rm
ou algo parecido.
Estou assumindo que você não tem personagens malucos (como espaço, aspas, "*", "?", "<", "|", etc.) nos seus nomes de arquivo. (Isso não deve ser um problema; as câmeras tendem a usar nomes de arquivo como "DSCN1234.JPG".)