使用 mv 命令将文件从一个文件夹移动到另一个文件夹 - 奇怪的例子

Gen*_*zzi 20 command mv syntax

我正在从surrey.ac.ukUNIX 初学者教程中学习 unix 命令,那里我发现了一种移动文件的奇怪方法。特别是,我在主目录中有文件夹 unixstuff,在 unixstuff 中有文件夹备份和文件 Caiti.txt 和 Caiti.bak。

根据上面的链接,要将 Caiti.bak 文件从 unixstuff 移动到备份,我必须确保当前目录是 unixstuff 并且我必须运行以下命令:

mv Caiti.bak backups/.
Run Code Online (Sandbox Code Playgroud)

请你解释一下这些/.字符的含义吗?点表示当前目录(在本例中为 unixstuff)。如果我运行命令:

mv Caiti.bak backups
Run Code Online (Sandbox Code Playgroud)

无论如何它都有效。

A.B*_*A.B 46

TL; 博士

这会强制目标是一个已经存在的目录,或者命令失败无效并用作故障安全。


的意思 .

典型的 Unix/类 Unix 文件系统中的每个目录都包括两个特殊目录:一个引用它所在的目录:另一个引用它所.在的父目录:(..允许在目录层次结构中向后移动)。它们与它们被发现的地方有关。所以目录.里面有一个名为backups references的目录backups。换句话说,当有一个名为 的目录时backupsbackups/.相当于backups.


源或目标是文件或目录的不同行为

  • 如果目录存在,这两个命令将具有相同的效果:当目标是目录mv时,将源移动到该目录。这就是预期的结果。

  • 如果目标backups是文件而不是目录:

    • 第一种情况将因错误而失败 Not a directory
    • 第二种情况将重命名Caiti.bak和覆盖backups
  • 如果目标不存在:

    • 第一种情况将失败 No such file or directory
    • 第二个命令会将文件重命名Caiti.bak为 file backups,导致前一种情况并且下次发生时可能会丢失数据。

附加/.到应该存在的目录目标并在出现错误时中止脚本是一种很好的做法。

当仅/在源是文件而不是目录时追加时,所有这些情况都将起作用。

如果我们不能假设,这个例子中的源是一个目录:

mv somedirectory targetnothere/
Run Code Online (Sandbox Code Playgroud)

不会失败(并且某个目录将被重命名,而不是被放入targetnothere或中止)。额外的.也会使这个案例失败:

$ mv somedirectory targetnothere/.
mv: cannot move 'somedirectory' to 'targetnothere/.': No such file or directory
Run Code Online (Sandbox Code Playgroud)

  • 为了消除对这些 sublte hacks(如果路径是从其他地方提供的路径操作)的需要,`mv` 有一个 `-t` 开关,无论目标是如何编写的,它都具有相同的效果。 (5认同)