假设我跑步,
cd /tmp/
mkdir -p foo/bar/
echo test > foo/bar/1
现在我有一个非常简单的
$ tree foo
foo
└── bar
└── 1
2 directories, 1 file
现在,如果我想移动foo/bar
以覆盖foo
,这样树看起来就像
$ tree foo
foo
└── 1
1 directories, 1 file
我可以运行什么命令?当我尝试时mv
,我得到了'foo/bar' and 'foo/bar' are the same file
mv foo/bar foo
mv: 'foo/bar' and 'foo/bar' are the same file
Linux 不支持这个吗?这是 GNU mv 的限制吗?
该
mv
命令有两种形式(不包括选项):第一种形式仅在 DEST 不存在或不是目录时才有效。如果不是目录,则先将其删除。
在所有其他情况下,包括第二个参数是现有目录或存在多个源时,系统都会假定您要将源移动到目录中。如果有多个源,并且最后一个项不是目录,则会出错。
如果这不是您想要的,请确保 DEST 不存在。
设置:
您希望的重组:
没有办法解决这个问题。mv 命令不支持覆盖目录。
没有直接调用
mv
支持这个我可能是错的,但这似乎是不可能的,而且UNIX System V
mv
也从未支持过这一点。我通过创建一个 tempdir 来解决这个问题,mktemp
这样我就可以完全删除父目录。似乎只要目标是目录,
mv
就会将源移动到目标中,而不是覆盖目标。这与rename
支持此功能的 C 中的底层函数不同。但是,如果目标是非rename
空目录,则C 中的底层函数不支持将源移动到目标,您将得到。perror
如果你试试。
这个错误对我来说很有意义!您尝试将“bar”移动到目录“foo”,但它已经在目录“foo”中了。
我觉得你只是想
只需使用:
rmdir
如果目录不为空,将会失败,这避免了无意中删除其他文件。