可以在同一目录中运行多个 mv 命令吗(竞争条件)?

D. *_*bbs 5 shell bash mv

我正在将大量文件 (400K+) 从一个目录移动到另一个目录,并且我有以下脚本来执行此操作(mv 命令无法直接工作的文件太多):

for file in *;
do
    mv $file ..
done
Run Code Online (Sandbox Code Playgroud)

如果我同时运行这个脚本两次(或更多),当/如果 mv 命令试图访问同一个文件时,是否会出现竞争条件?

我在网上环顾四周,但没有找到任何明确的答案。谢谢!

Hau*_*ing 5

确实存在竞争条件(尽管不会造成伤害)。

*是在进入循环扩展。如果您同时运行此脚本的第二个实例,则它可能不会执行任何操作,因为它尝试移动的所有文件都已被移动。如果在移动操作期间没有在源目录中创建文件,那么错误消息应该是您最大的问题。

但总的来说,这种结构是一个非常糟糕的主意。*扩展为排序列表。AFAIK 无法停用它。显然,仅排序是 400K 文件的噩梦。请参阅man bash“路径名扩展”部分:

分词后,除非设置了 -f 选项,否则 bash 会扫描每个单词中的字符 *、? 和 [。如果出现这些字符中的一个,则将该单词视为一个模式,并替换为与该模式匹配的按字母顺序排序的文件名列表。

此外,您不应mv为每个文件运行一个实例,因为您可以一次移动多个文件。

这是一个更好的解决方案(在 GNU 世界中):

find . -mindepth 1 -maxdepth 1 -exec mv --target-directory=DIRECTORY {} +
Run Code Online (Sandbox Code Playgroud)