Eu queria mover cerca de 1000 arquivos mp3 de um diretório chamado 'music' contendo uma complicada estrutura de diretórios aninhada, para um único diretório chamado 'mp3s', para que eu pudesse ouvi-los no meu carro.
O comando que usei foi:
find music -name '*mp3' -exec mv -v -t mp3s {} +
Algo estranho aconteceu quando eu executei o comando no entanto. Após a conclusão do comando, notei que quatro arquivos foram omitidos. Esses arquivos foram:
"music/Michael Hedges/Michael Hedges - Taproot/06 - Chava's Song.mp3"
'music/Michael Hedges/Michael Hedges - Aerial Boundaries/04 - Ragamuffin.mp3'
'music/Jonas Hellborg/1988 - Bass/07. Blues For LW.flac.mp3'
'music/Jonas Hellborg/1988 - Axis/03. Roman.flac.mp3'
Executei exatamente o mesmo comando novamente e, desta vez, os quatro arquivos omitidos anteriormente foram movidos conforme o esperado.
Não consigo imaginar por que find
poderia fazer algo inesperado como isso. Por que isso pode ter acontecido?
Executado no shell bash no Ubuntu.
Hipótese: colisões de nomes
Imagine que em algum momento o comando fosse assim:
foo.mp3
fromsome_dir
foi movido paramp3s
, masfoo.mp3
deanother_dir
acionado:Aparentemente, a mensagem passou despercebida no rebanho de mensagens causadas por
-v
.Mais tarde o segundo
find
tentou se mover…/another_dir/foo.mp3
novamente, mas desta vez não havia…/some_dir/foo.mp3
, entãomp3s/foo.mp3
não foi considerado "apenas criado", foi sobrescrito.Note
-exec mv … {} +
pode executar mais de ummv
. Se…/some_dir/foo.mp3
e…/another_dir/foo.mp3
fossem atribuídos a diferentes invocações demv
, o últimomv
não seria consideradomp3s/foo.mp3
como "recém criado". Isso significa que, no seu caso, pode ter havido mais colisões de nomes e alguns arquivos foram substituídos silenciosamente. Apenas colisões de nomes em que arquivos com nomes de base idênticos foram atribuídos ao mesmomv
fizeram com que alguns arquivos não fossem movidos.Prova de conceito