約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.mp3
fromsome_dir
がに移動されましたが、fromがトリガーされました。mp3s
foo.mp3
another_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
$