在 GUI 环境中,带有替换功能的拖放操作将用复制到的内容替换文件和整个目录(包括内容)。有没有办法使用“mv”命令实现同样直观的结果?
答案1
不与mv
.
(尽管它的名字如此)的核心功能mv
是改名一个东西。 UNIX 做出的保证之一是重命名是原子的——您永远不允许看到部分完成的重命名。如果您想要更改/etc/passwd
其他程序可能正在查看的文件(例如),并且您希望它们看到该文件的旧版本或新版本,则此保证非常有用,并且没有其他可能性。但是像你所描述的“递归重命名”会打破这个保证——你可以在中间停止它,你会得到一棵半移动的树,可能会很混乱——所以它并不真正符合这个哲学的mv
。这是我对为什么mv -r
不存在的猜测。
(没关系,这mv
会以其他更小的方式破坏这一理念。例如,当将文件从一个文件系统移动到另一个文件系统时,mv
实际上会cp
执行 a 操作。)rm
足够的哲学。如果您想递归地将一棵树从一个地方移动(“拖放”)到另一个地方在同一个文件系统上,可以得到mv
如下的效率和速度(举例):
cp -al source/* dest/ && rm -r source/*
-l
to 标志的意思cp
是“创建硬链接而不是复制”——它有效地创建一个新文件名,该文件名指向与旧文件名相同的文件数据。不过,这只适用于支持硬链接的文件系统——因此任何本机 UNIX 风格的文件系统都可以,但它不适用于 FAT。
意思&&
是“如果前面的命令成功,则仅运行后面的命令”。如果您愿意,您可以一次运行这两个命令。
答案2
我认为您无法复制您所描述的拖放行为mv
,因为目标中的非空子目录不会被替换。
也许rsync
?就像是rsync -a -r source/ target/
?使用 运行,-v -n
首先进行详细的试运行,以确保它能够满足您的要求。
答案3
mv -f /path/to/source/folder/* /destination/folder/
会将 /path/to/source/folder 中的所有内容(包括文件和目录)移动到 /destination/folder。
并会覆盖现有的文件和目录。
答案4
您可能想要更改此问题的正确答案:
https://github.com/iaindooley/pickdrop
例子:
说我有:
test/
test/index.php
test/images/
test/images/a.jpg
test/images/thing.png
我想将这些东西移至 /site
所以它看起来像:
site/
site/public/
site/public/index.php
site/public/a.jpg
site/public/thing.png
我可以去:
cd images &&
pick a.jpg thing.png
cd .. &&
pick index.php &&
cd .. &&
mkdir site &&
mkdir site/public &&
cd site/public &&
drop
这实际上是剪切和粘贴。