我想这会有点棘手:-)
当我在文件夹中打开终端并运行脚本时,该脚本应该:
- 将所有子文件夹的所有内容移动到顶级父文件夹(递归)
- 删除所有空文件夹
我们所在的父文件夹不包含任何文件夹,只包含所有文件夹的内容。
它也适用于隐藏文件和文件夹。这对于房屋清洁非常有用 :-)
我尝试过类似的事情:
find . -type f -name "*" -depth | xargs mv ./
但没有运气。
感谢您的帮助 :-)
答案1
我认为最简单、最干净的方法是使用此命令:
find . -type f -exec mv --backup=numbered {} . \; && find . -maxdepth 1 -type d -exec rm -r {} +
find
命令 #1:
.
:在当前工作目录中搜索;-type f
:搜索文件;-exec [...]
:对每个结果执行一个命令(使用{} [...] \;
)或者对所有结果执行一个命令(使用{} +
);mv --backup=numbered . \;
:移动当前工作目录中的每个结果,并创建当前工作目录中已有的同名文件的备份;
find
命令 #2:
.
:在当前工作目录中搜索;-maxdepth 1
:仅在目标目录层次结构的第一级搜索;-type d
:搜索目录;-exec [...]
:对每个结果执行一个命令(使用{} [...] \;
)或者对所有结果执行一个命令(使用{} +
);rm -r {} +
:删除每个结果;
在测试目录层次结构上进行测试:
user@debian ~/tmp % tree -a
.
├── 1
│ ├── file1
│ ├── file2
│ ├── file3
│ └── .hidden
├── 2
│ ├── file1
│ ├── file2
│ ├── file3
│ └── .hidden
└── 3
├── file1
├── file2
├── file3
└── .hidden
3 directories, 12 files
user@debian ~/tmp % find . -type f -exec mv --backup=numbered {} . \; && find . -type d -exec rm -r {} +
rm: refusing to remove "." or ".." directory: skipping "."
user@debian ~/tmp % tree -a
.
├── file1
├── file1.~1~
├── file1.~2~
├── file2
├── file2.~1~
├── file2.~2~
├── file3
├── file3.~1~
├── file3.~2~
├── .hidden
├── .hidden.~1~
└── .hidden.~2~
0 directories, 12 files
答案2
要递归移动当前目录中的所有文件,请注意,这会将所有文件移动到此目录中(而不是它们的父目录):
find . -type f -exec mv -i -t . {} +
您也-i
可以使用--backup=numbered
@kos 已经展示的方法。
删除所有空目录:
find . -type d -empty -delete
阅读man find
以获得更多想法。
答案3
这应该可以帮到你:
find . -type f -exec mv --backup=numbered "{}" . \; && find . -type d -empty -delete
这是 2 个查找命令,第一个命令查找并移动文件,第二个命令仅在第一个命令成功时才会运行并将删除目录。
感谢 Rinzwind 指出重复文件名的危险,促使我添加--backup=numbered
Kos 最初使用的选项。