`mv` 命令没有重命名,而是从 ansible 移动到现有目录

`mv` 命令没有重命名,而是从 ansible 移动到现有目录

我正在运行一个 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

这样,您将避免不必要地移动到预先存在的文件夹中。

相关内容