如何将多个不同的子文件夹向下移动一级?

如何将多个不同的子文件夹向下移动一级?

我有大量文件,结构如下:/base/ 中的所有文件,然后是带有 2 个“随机”字母的 4 个文件夹,然后是一系列彼此相关的文件。

例子:

/base/ab/12/13/37/file1.txt
/base/ab/12/13/37/file2.txt
/base/ab/12/13/37/file3.txt
/base/cd/b8/e2/a1/other1.txt
.... 
/base/cd/b8/e2/a1/other52.txt
/base/af/f3/45/9e/third1.txt
/base/af/f3/45/9e/third2.txt

ETC

我想保留大部分结构,但在最后添加一个附加(extra_folder)文件夹,我的文件就属于该文件夹。这样上面的就改成:

/base/ab/12/13/37/extra_folder/file1.txt
/base/ab/12/13/37/extra_folder/file2.txt
/base/ab/12/13/37/extra_folder/file3.txt
/base/cd/b8/e2/a1/extra_folder/other1.txt

我预计我需要一个 shell 脚本和 move 命令。

非常感谢。

答案1

这就是我们开始的地方:

$ tree base/
base/
|-- ab
|   `-- 12
|       `-- 13
|           `-- 37
|               |-- file1.txt
|               |-- file2.txt
|               `-- file3.txt
|-- af
|   `-- f3
|       `-- 45
|           `-- 9e
|               |-- third1.txt
|               `-- third2.txt
`-- cd
    `-- b8
        `-- e2
            `-- a1
                |-- other1.txt
                `-- other52.txt

12 directories, 7 files

首先我们添加新目录:

$ find base -type d -mindepth 4 -maxdepth 4 -exec mkdir {}/extra_folder ';'

我们仅使用-mindepth 4-maxdepth 4来在第四级创建新目录。如果没有,-mindepth 4我们将在更高级别上获得新目录,如果没有-maxdepth 4新目录,它们本身将被新目录填充,直到路径名变得太长而find无法再创建更多目录。

extra_folder目录是通过mkdir调用 from创建的-exec。现在我们有

$ tree base/
base/
|-- ab
|   `-- 12
|       `-- 13
|           `-- 37
|               |-- extra_folder
|               |-- file1.txt
|               |-- file2.txt
|               `-- file3.txt
|-- af
|   `-- f3
|       `-- 45
|           `-- 9e
|               |-- extra_folder
|               |-- third1.txt
|               `-- third2.txt
`-- cd
    `-- b8
        `-- e2
            `-- a1
                |-- extra_folder
                |-- other1.txt
                `-- other52.txt

15 directories, 7 files

然后我们将文件向下移动:

$ find base -maxdepth 5 -type f -execdir mv {} extra_folder ';'

这将查找base第五级目录中或目录下的任何常规文件(我假设仅在最低级别上有文件)。然后,它用于在找到的文件所在的目录内-execdir运行命令(将是找到的文件的基本名称)。mv{}

我们最终得到

$ tree base/
base/
|-- ab
|   `-- 12
|       `-- 13
|           `-- 37
|               `-- extra_folder
|                   |-- file1.txt
|                   |-- file2.txt
|                   `-- file3.txt
|-- af
|   `-- f3
|       `-- 45
|           `-- 9e
|               `-- extra_folder
|                   |-- third1.txt
|                   `-- third2.txt
`-- cd
    `-- b8
        `-- e2
            `-- a1
                `-- extra_folder
                    |-- other1.txt
                    `-- other52.txt

15 directories, 7 files

一气呵成:

$ find base -type f \
    -execdir sh -c '[ ! -d "$1" ] && mkdir "$1"; mv "$2" "$1"' sh 'extra_folder' {} ';'

这会找到所有常规文件并将它们移动到名为 的目录中,extra_folder无论它们从哪里开始。多次运行此命令将使它们越来越向下移动。

调用的迷你脚本-execdir

[ ! -d "$1" ] && mkdir "$1"
mv "$2" "$1"

这将以文件夹名称 as$1和文件名 as进行调用$2,如果文件夹不存在,则创建该文件夹,然后将文件移入其中。

相关内容