我想将大约 1000 个 mp3 文件从包含复杂嵌套目录结构的名为“music”的目录移动到名为“mp3s”的单个目录中,以便我可以在车上收听它们。
我使用的命令是:
find music -name '*mp3' -exec mv -v -t mp3s {} +
但是,当我执行命令时发生了一些奇怪的事情。命令完成后,我注意到四个文件被省略了。这些文件是:
"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'
我再次执行了完全相同的命令,这一次之前省略的四个文件按预期移动了。
我无法想象为什么find
会做这样出乎意料的事情。为什么会发生这种情况?
在 Ubuntu 上执行到 bash shell。
假设:名称冲突
想象一下,命令就像:
foo.mp3
fromsome_dir
被移动到mp3s
,但foo.mp3
fromanother_dir
触发:显然,该消息在由
-v
.后来第二个
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
导致某些文件无法移动。概念证明