我正在将大量文件 (400K+) 从一个目录移动到另一个目录,并且我有以下脚本来执行此操作(mv 命令无法直接工作的文件太多):
for file in *;
do
mv $file ..
done
Run Code Online (Sandbox Code Playgroud)
如果我同时运行这个脚本两次(或更多),当/如果 mv 命令试图访问同一个文件时,是否会出现竞争条件?
我在网上环顾四周,但没有找到任何明确的答案。谢谢!
确实存在竞争条件(尽管不会造成伤害)。
该*是在进入循环扩展。如果您同时运行此脚本的第二个实例,则它可能不会执行任何操作,因为它尝试移动的所有文件都已被移动。如果在移动操作期间没有在源目录中创建文件,那么错误消息应该是您最大的问题。
但总的来说,这种结构是一个非常糟糕的主意。*扩展为排序列表。AFAIK 无法停用它。显然,仅排序是 400K 文件的噩梦。请参阅man bash“路径名扩展”部分:
分词后,除非设置了 -f 选项,否则 bash 会扫描每个单词中的字符 *、? 和 [。如果出现这些字符中的一个,则将该单词视为一个模式,并替换为与该模式匹配的按字母顺序排序的文件名列表。
此外,您不应mv为每个文件运行一个实例,因为您可以一次移动多个文件。
这是一个更好的解决方案(在 GNU 世界中):
find . -mindepth 1 -maxdepth 1 -exec mv --target-directory=DIRECTORY {} +
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3176 次 |
| 最近记录: |