将具有特定名称的文件夹提取到并行目录结构?

将具有特定名称的文件夹提取到并行目录结构?

我有一个包含照片和视频的目录树,我在其中通过路径“标记”了一些信息。我想要做的是将特定名称的所有文件夹移动到单独的文件夹中,但重现通向该名称的每个文件夹实例的路径。例如,从以下内容开始:

/Media
.../Pics
....../Travel
........./Round-The-World1
........./Round-The-World2
............./Japan
............./Europe
................/Italy
................/Spain
....../Home
.../Vids
....../Travel
........./Round-The-World1
........./Round-The-World2
............./Japan
............./Europe
................/Italy
................/Spain
....../Home

假设我想移动确切名称为“Europe”的文件夹(即不使用“Europe”作为子字符串 - 仅移动名为“Europe”的文件夹及其子文件夹)。期望的结果:

/Media
.../Pics
....../Travel
........./Round-The-World1
........./Round-The-World2
............./Japan
....../Home
.../Vids
....../Travel
........./Round-The-World1
........./Round-The-World2
............./Japan
....../Home

/New
.../Pics
....../Travel
........./Round-The-World2
............./Europe
................/Italy
................/Spain
.../Vids
....../Travel
........./Round-The-World2
............./Europe
................/Italy
................/Spain

这有点类似于提取具有特定文件扩展名的文件并保留目录结构?,但我是 Linux cli 的初学者,并且不想冒搞砸我的组织的风险 - 所以任何帮助将不胜感激:)

答案1

在查看以下答案之前,您需要考虑的一件事是,您将有效地从头到尾重新创建整个路径/

这将是一个多步骤的过程,因为您希望重新创建父文件夹结构,而不是精确复制它及其内容。结构如下

home/
├── fol_a
│   ├── fol_ABC
│   │   └── My Folder
│   │       └── file 2
│   └── fol_XYZ
│       └── My Folder
│           ├── file1
│           └── fol_extra
│               └── file 3
└── my test
   
11 directories, 3 files

换句话说,完整路径file1/home/fol_a/fol_XYZ/My Folder/file1。我们的目标是将文件夹My Folder及其内容移动到该my test文件夹​​,使其路径/home/my test/home/fol_a/fol_XYZ/My Folder/*变为/home/my test/home/fol_a/fol_ABC/My Folder/*

1.重建目录结构并复制适当的文件夹及其内容

从同名文件夹所在的树枝的父文件夹运行(在我们的示例中为fol_a,但在您的示例中为/Media),您可以执行以下操作:

笔记:bash -c导出这些变量,因为 DEST 和 SOURCE 对于将变量输入到of是必需的find

DEST=目标路径 SOURCE=要复制的文件夹名称,重新创建其完整路径 BRANCH=您要复制的同名文件夹的公共分支

export DEST="/home/my test"
export SOURCE="My Folder"
export BRANCH="/home/fol_a"
find "$BRANCH" -type d -name "$SOURCE" -exec bash -c 'mkdir -p "$DEST""$(realpath "{}")" ; cp -r "{}"/* "$DEST""$(realpath "{}")"' \;

注意:如果您收到类似消息 cp: cannot stat './[FOLDERNAME]/*': No such file or directory **这不是一个错误,它只是意味着**cp -r [FOLDERNAME]/* 命令恰好在空文件夹上执行


  • 检查重新创建的文件夹树和目标文件夹中的内容

要快速检查文件夹结构和文件以查看复制是否正确,您可以运行

tree "$DEST"/..

在此阶段(删除之前),您的整个文件夹树将如下所示:

home/
├── fol_a
│   ├── fol_ABC
│   │   └── My Folder
│   │       └── file 2
│   └── fol_XYZ
│       └── My Folder
│           ├── file1
│           └── fol_extra
│               └── file 3
└── my test
    └── home
        └── fol_a
            ├── fol_ABC
            │   └── My Folder
            │       └── file 2
            └── fol_XYZ
                └── My Folder
                    ├── file1
                    └── fol_extra
                        └── file 3

14 directories, 6 files


2.从旧的公共分支中删除文件夹树

最后(在仔细检查所有文件实际上都在适当的文件夹等中之后)如果一切看起来正确,并且您希望真正移动fol_d及其内容(而不仅仅是复制),您可以使用以下命令完成它

来自先前声明的相同公共分支(在上面的示例中是/home/fol_A

find "$BRANCH" -type d -name "$SOURCE" -exec rm -r "{}" \;

笔记:您可能会收到类似消息 ,但这在使用和指令find [$SOURCE] :No such file or directory删除内容和目录时或多或少是正常的。find-exec

最后一项检查是运行tree,最终输出变为:

home/
├── fol_a
│   ├── fol_ABC
│   └── fol_XYZ
└── my test
    └── home
        └── fol_a
            ├── fol_ABC
            │   └── My Folder
            │       └── file 2
            └── fol_XYZ
                └── My Folder
                    ├── file1
                    └── fol_extra
                        └── file 3

11 directories, 3 files

相关内容