将子文件夹“提取”到父文件夹中的脚本

将子文件夹“提取”到父文件夹中的脚本

我想这会有点棘手:-)

当我在文件夹中打开终端并运行脚本时,该脚本应该:

  1. 将所有子文件夹的所有内容移动到顶级父文件夹(递归)
  2. 删除所有空文件夹

我们所在的父文件夹不包含任何文件夹,只包含所有文件夹的内容。

它也适用于隐藏文件和文件夹。这对于房屋清洁非常有用 :-)

我尝试过类似的事情:

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

  1. 要递归移动当前目录中的所有文件,请注意,这会将所有文件移动到此目录中(而不是它们的父目录):

    find . -type f -exec mv -i -t . {} +  
    

您也-i可以使用--backup=numbered@kos 已经展示的方法。

  1. 删除所有空目录:

    find . -type d -empty -delete
    

阅读man find以获得更多想法。

答案3

这应该可以帮到你:

find . -type f -exec mv --backup=numbered "{}" . \; && find . -type d -empty -delete

这是 2 个查找命令,第一个命令查找并移动文件,第二个命令仅在第一个命令成功时才会运行并将删除目录。

感谢 Rinzwind 指出重复文件名的危险,促使我添加--backup=numberedKos 最初使用的选项。

相关内容