我有大量文件,结构如下:/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
,如果文件夹不存在,则创建该文件夹,然后将文件移入其中。