手头上的问题

手头上的问题

我有这个文件夹结构:

foo
`----> bar

如何将 的内容提取barfoo

mv -f bar/* .从内部尝试过foo

-f,--强制|覆盖前不要询问

但我得到“无法移动bar/ajax到,foo/ajax因为目录不为空”

我该如何解决这个问题?

答案1

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移动所有文件,然后删除留下的空目录。

答案2

手头上的问题

您希望将内容foo/bar/上移至foo/

我将参考这篇关于超级用户的文章这篇文章来自服务器故障在解决方案中。

解决方案

根据用户 Stephan202 的说法,您正在寻找以下命令来执行此任务:

cd /path/to/foo/bar
mv * .[^.]* ..

还应该可以从内部foo/bar/运行以下命令:

(shopt -s dotglob; mv -- * ..)

验证您也拥有正确的权限。如果需要,请使用 root(sudo) 权限运行该命令。

结论

如果您对此答案有任何疑问或疑问,请发表评论。我强烈建议您在尝试命令之前仔细阅读我提供的每个链接。我感谢您提供反馈来纠正任何误解并改进我的帖子。我可以根据需要更新我的答案。

祝你好运!

答案3

编辑:我修改了这个答案以表明优点和缺点。

有些手册页相当简洁,因为相应的信息手册中提到了这些信息。

男人

-f,--强制

       覆盖前不提示

信息

        笔记: mv只会取代空目录在目的地。诊断会跳过冲突的填充目录。

[...]

-F, - 力量

       如果目标文件存在但通常是不可写的,标准输入是终端,不给出-for选项,提示用户是否替换文件。 (您可能拥有该文件,或者对其目录具有写入权限。)如果响应不是肯定的,则将跳过该文件。--forcemv

mv不能替换非空目录,但可以覆盖用户拥有的现有文件,这些文件通常是不可写的(所有者没有写权限,请参见引用)。

foo    
|-- ajax
`-- bar
    `-- ajax

您可以合并目录foo/ajaxfoo/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/datanetwork选择合并具有相同名称的目录(参见下文)。

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

答案4

只需使用移动命令:

cd foo
mv bar/* .

正如 Jeff Schaller 建议的那样,使用

 shopt -s dotglob 

在 mv 命令之前移动隐藏文件,-i如果您想在覆盖之前进行交互式检查,请使用 mv选项

相关内容