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