我正在运行一个 ansible 任务(在角色内部):
- name: Rename dir
become: yes
shell: mv /data/files/1.6.5 /data/files/1.7.0
预期效果是将其1.6.5
重命名为1.7.0
现在,在目标主机上,有一个实例我已经1.7.0
存在:
~$ sudo ls -l /data/files/
total 1312
drwxr-x--- 2 ubuntu admin 643450 May 22 08:45 v1.6.5
drwxr-x--- 2 ubuntu admin 696320 May 25 10:19 v1.7.0
因此运行上述命令,我得到了尴尬的结果将 1.6.5 迁移至 1.7.0而不是重命名它。
这是为什么?这不符合直觉。1.6.5
不是空的, 也不是1.7.0
。
只是确保我没有遗漏一些显而易见的东西。或者这绝对不可能?我是从其他原因得到这个的吗?我只是向我展示了一个事实,我现在有1.6.5
内部信息1.7.0
,并进行取证以了解为什么会这样。
答案1
该mv
命令不会检查目标文件夹是否存在。如果不存在,它将重命名源文件夹。否则,它只会假设假装的结果是将源移动到目标。
来自mv
手册页:
Rename SOURCE to DEST, or move SOURCE(s) to DIRECTORY.
因此,如果您不希望发生这种情况,您可以在 Ansible 剧本中添加一个检查,以验证目标文件夹是否已存在,然后仅在不存在时移动该文件夹:
- name: Check if the folder exists
stat:
path: /data/files/1.7.0
register: dest_folder
become: yes
- name: Rename dir
become: yes
shell: mv /data/files/1.6.5 /data/files/1.7.0
when: not dest_folder.stat.exists
这样,您将避免不必要地移动到预先存在的文件夹中。