"find -exec mv"に4つのファイルがありません。

約1000個のmp3ファイルを複雑にネストされたディレクトリ構造を含む「music」というディレクトリから「mp3s」という単一のディレクトリに移動して、車でそのファイルを聞くことができるようにしたいと思います。

私が使用するコマンドは次のとおりです。

find music -name '*mp3' -exec mv -v -t mp3s {} +

ところが命令を実行すると異常な現象が発生します。コマンドが完了した後、4つのファイルが省略されていることを確認しました。これらのファイルは次のとおりです。

"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'

私は同じコマンドを再実行し、今回は以前に省略された4つのファイルが期待どおりに移動されました。

findなぜそのような予期しないことが起こるのか想像できません。なぜこれが起こるのですか?

Ubuntuのbashシェルで実行されます。

ベストアンサー1

仮定:名前の競合

ある時点で、コマンドが次のように見えたと想像してみてください。

mv -v -t mp3s … …/some_dir/foo.mp3 … …/another_dir/foo.mp3 …

foo.mp3fromsome_dirがに移動されましたが、fromがトリガーされました。mp3sfoo.mp3another_dir

mv: will not overwrite just created 'mp3s/foo.mp3' with '…/another_dir/foo.mp3'

明らかにメッセージグループでメッセージが目立たなくなりました-v

後で2番目はfind再び移動しようとしましたが、…/another_dir/foo.mp3今回は移動しなかった…/some_dir/foo.mp3ためmp3s/foo.mp3、「作成された」とは見なされずに上書きされました。

-exec mv … {} +複数が実行されている可能性がありますmv…/some_dir/foo.mp3…/another_dir/foo.mp3他の通貨に割り当てられている場合、mv後者は「作成されたばかりのもの」とはmv見なされません。mp3s/foo.mp3これは、あなたの場合、名前の競合がより多く発生し、一部のファイルが自動的に上書きされる可能性があることを意味します。名前の競合のため、同じデフォルト名を持つファイルが同じ名前に割り当てられている場合にのみ、mv一部のファイルを移動できません。


概念の証拠

$ mv --version
mv (GNU coreutils) 8.30
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Mike Parker, David MacKenzie, and Jim Meyering.
$
$ mkdir -p music/a music/b music/c mp3s
$ touch music/a/A music/b/B music/c/A
$ tree --noreport
.
|-- mp3s
`-- music
    |-- a
    |   `-- A
    |-- b
    |   `-- B
    `-- c
        `-- A
$ find music -type f -exec mv -v -t mp3s {} +
renamed 'music/a/A' -> 'mp3s/A'
renamed 'music/b/B' -> 'mp3s/B'
mv: will not overwrite just-created 'mp3s/A' with 'music/c/A'
$ tree --noreport
.
|-- mp3s
|   |-- A
|   `-- B
`-- music
    |-- a
    |-- b
    `-- c
        `-- A
$ find music -type f -exec mv -v -t mp3s {} +
renamed 'music/c/A' -> 'mp3s/A'
$ tree --noreport
.
|-- mp3s
|   |-- A
|   `-- B
`-- music
    |-- a
    |-- b
    `-- c
$ 

おすすめ記事