Black Asked: 2018-06-22 03:59:14 +0800 CST2018-06-22 03:59:14 +0800 CST 2018-06-22 03:59:14 +0800 CST 如何将文件夹的内容移动到当前文件夹? 772 我有这个文件夹结构: foo `----> bar 如何提取barinto的内容foo? mv -f bar/* .我从内部尝试过foo。 -f,--强制 | 覆盖前不要问 但我得到“无法移动bar/ajax到,foo/ajax因为目录不为空” 我该如何解决这个问题? cp mv 5 个回答 Voted Best Answer muru 2018-07-06T02:58:21+08:002018-07-06T02:58:21+08:00 mv会覆盖文件,但会拒绝覆盖目录。没有一个命令可以合并目录并删除源目录(这可能是您想要的mv)。甚至rsync --remove-source-files会留下空目录。 您可以使用命令组合: cp -a dev/. . rm -r dev 它将所有内容复制dev到当前目录,然后删除该dev目录。 或者: rsync -a --remove-source-files dev/ . find dev -depth -type d -exec rmdir {} \; 它用于rsync移动所有文件,然后删除留下的空目录。 kemotep 2018-07-06T03:08:43+08:002018-07-06T03:08:43+08:00 手头的问题 您希望将内容foo/bar/向上移动到foo/. 我将在解决方案中引用超级用户的这篇文章以及来自 serverfault的这篇文章。 解决方案 根据用户 Stephan202,您正在寻找以下命令来执行此任务: cd /path/to/foo/bar mv * .[^.]* .. 也应该可以从内部foo/bar/运行以下命令: (shopt -s dotglob; mv -- * ..) 验证您也具有正确的权限。如果需要,使用 root(sudo) 权限运行命令。 结论 如果您对此答案有任何疑问或问题,请发表评论。我强烈建议您在尝试命令之前通读我提供的每个链接。我感谢反馈以纠正任何误解并改进我的帖子。我可以根据需要更新我的答案。 祝你好运! user286944 2018-07-06T09:25:07+08:002018-07-06T09:25:07+08:00 编辑:我修改了这个答案以表明利弊。 一些手册页相当简洁,因为相应的信息手册中提到了这些信息。 男人 -f,--强制 覆盖前不提示 信息 注意: mv只会替换目标中的空目录。使用诊断跳过冲突的填充目录。 [...] -f,-- 强制 如果目标文件存在但通常不可写,标准输入是终端,并且没有给出-for选项,提示用户是否替换文件。(您可能拥有该文件,或者对其目录具有写入权限。)如果响应不是肯定的,则跳过该文件。--forcemv mv不能替换非空目录,但可以覆盖用户拥有的现有文件,这些文件通常是不可写的(所有者没有写权限,参见引用)。 foo |-- ajax `-- bar `-- ajax 您可以合并目录foo/ajax并保留所有文件或覆盖@murufoo/bar/ajax建议的相同文件。 但是,如果这些目录的内容不相关,则此方法不适用。乍一看可能并不明显,所以让我们看看一棵新树。 prompt% tree home/network home/network/ ├── data │ ├── img │ │ └── demo.png │ └── src │ ├── contact.pdf │ └── report.pdf ├── hardware │ ├── api │ ├── docs │ └── src │ └── driver.c ├── misc │ └── src │ └── init.py ├── README └── src ├── main.c └── manager.c 我们可以将内容network/data移入network并选择合并具有相同名称的目录(参见下文)。 prompt% cp -ab home/network/data/* home/network prompt% rm -r home/network/data/* prompt% tree home/network home/network/ ├── data ├── hardware │ ├── api │ ├── docs │ └── src │ └── driver.c ├── img │ └── demo.png ├── misc │ └── src │ └── init.py ├── README └── src ├── contact.pdf ├── main.c ├── manager.c └── report.pdf 如我们所见,最终目录network/src可能包含移动后不相关的文件。如果不希望,我们可以在移动后重命名具有相同名称的文件和目录。 prompt% mv -b -S "_data" home/network/data/* home/network prompt% tree home/network home/network/ |-- README |-- data |-- hardware | |-- api | |-- docs | `-- src | `-- driver.c |-- lib | `-- demo.png |-- misc | `-- src | `-- init.py |-- src | |-- contact.pdf | `-- report.pdf `-- src_data |-- main.c `-- manager.c ctrl-alt-delor 2018-07-06T10:15:49+08:002018-07-06T10:15:49+08:00 如果您有一个foo 只包含一个目录的目录bar。(bar可能包含其他东西)。 并且您想重命名foo/bar→ foo,然后执行: mv -T foo foo.original mv -T foo.original/bar foo rmdir foo.original -T如果您mv没有此选项,您可以离开,但这样会更安全。 Jean-Paul Sabatier 2018-06-22T04:03:36+08:002018-06-22T04:03:36+08:00 只需使用移动命令: cd foo mv bar/* . 正如 Jeff Schaller 建议的那样,使用 shopt -s dotglob 在 mv 命令之前移动隐藏文件并使用-imv 选项,如果您想要在覆盖之前进行交互式检查
mv
会覆盖文件,但会拒绝覆盖目录。没有一个命令可以合并目录并删除源目录(这可能是您想要的mv
)。甚至rsync --remove-source-files
会留下空目录。您可以使用命令组合:
它将所有内容复制
dev
到当前目录,然后删除该dev
目录。或者:
它用于
rsync
移动所有文件,然后删除留下的空目录。手头的问题
您希望将内容
foo/bar/
向上移动到foo/
.我将在解决方案中引用超级用户的这篇文章以及来自 serverfault的这篇文章。
解决方案
根据用户 Stephan202,您正在寻找以下命令来执行此任务:
也应该可以从内部
foo/bar/
运行以下命令:验证您也具有正确的权限。如果需要,使用 root(sudo) 权限运行命令。
结论
如果您对此答案有任何疑问或问题,请发表评论。我强烈建议您在尝试命令之前通读我提供的每个链接。我感谢反馈以纠正任何误解并改进我的帖子。我可以根据需要更新我的答案。
祝你好运!
编辑:我修改了这个答案以表明利弊。
一些手册页相当简洁,因为相应的信息手册中提到了这些信息。
mv
不能替换非空目录,但可以覆盖用户拥有的现有文件,这些文件通常是不可写的(所有者没有写权限,参见引用)。您可以合并目录
foo/ajax
并保留所有文件或覆盖@murufoo/bar/ajax
建议的相同文件。但是,如果这些目录的内容不相关,则此方法不适用。乍一看可能并不明显,所以让我们看看一棵新树。
我们可以将内容
network/data
移入network
并选择合并具有相同名称的目录(参见下文)。如我们所见,最终目录
network/src
可能包含移动后不相关的文件。如果不希望,我们可以在移动后重命名具有相同名称的文件和目录。如果您有一个
foo
只包含一个目录的目录bar
。(bar
可能包含其他东西)。并且您想重命名
foo/bar
→foo
,然后执行:-T
如果您mv
没有此选项,您可以离开,但这样会更安全。只需使用移动命令:
正如 Jeff Schaller 建议的那样,使用
在 mv 命令之前移动隐藏文件并使用
-i
mv 选项,如果您想要在覆盖之前进行交互式检查