在 Linux 中保留目录结构的同时复制特定文件类型

不久前,我们学会了如何 将某种类型的文件从一个目录复制到另一个目录 在 Linux 中。 今天我们将做同样的事情,但也要保留目录结构。 这个简短的教程解释了如何在保持 Linux 中的目录结构的同时复制特定的文件类型。 在这里,我给出了两种不同的方法来做到这一点。 只需选择适合您的任何一个。

在 Linux 中保留目录结构的同时复制特定文件类型

想象一下这个场景。

我有一个名为 “Linux” 不同类型的文件保存在不同的子目录中。 看看下面的目录结构:

$ tree Linux/
Linux/
├── dir1
│   ├── English
│   │   └── Kina - Can We Kiss Forever.mp3
│   ├── Instrumental
│   │   └── Chill Study Beats.mp3
│   └── Tamil
│       ├── Kannan Vanthu.mp3
│       └── yarenna.mp3
├── dir2
│   ├── file.docx
│   └── Raja Raja Chozan Naan.mp3
├── dir3
│   ├── Bamboo Flute - Meditation - Healing - Sleep - Zen.mp3
│   └── pic.jpg
└── dir4
    ├── Aaruyirae.mp3
    └── video.mp4

7 directories, 10 files

使用 tree 命令列出目录内容

正如您在上面的目录结构中看到的, Linux 目录有四个子目录,即 目录1, 目录2, 目录3目录4. 这 mp3 文件分散在所有四个子目录中。 现在,我想复制所有 mp3 文件到另一个名为 “骨科” 而且我想在目标目录中保持相同的目录结构。

首先,我们将看到如何使用“find”命令来做到这一点。

方法 1 – 使用“find”和“cp”或“cpio”命令

进入源目录:

$ cd Linux/

并使用“find”命令复制所有 mp3 fie 类型:

$ find . -name '*.mp3' -exec cp --parents {} ~/ostechnix ;

让我们分解上面的命令,看看每个选项的作用。

  • 寻找 – 在类 Unix 系统中查找文件和文件夹的命令。
  • (.) – 表示我们从当前目录复制内容。
  • -iname ‘*.mp3’ – 搜索与扩展名 .mp3 匹配的文件。
  • -exec cp – 执行“cp”命令将文件从源目录复制到目标目录。
  • – 父母 – 如果需要,创建中间父目录以保留父目录结构。
  • {} – 自动替换为“find”命令找到的文件的文件名。 并且大括号被逃脱了 在某些“查找”命令版本中保护它们不被 shell 扩展。 你也可以使用 {} 没有转义字符。
  • ~/ostechnix – 目标目录保存匹配的文件。
  • ; – 表示要执行的命令现在已完成,并在下一场比赛中再次执行该命令。

此命令将从 ~/Linux 目录中查找所有 mp3 类型文件并将其复制到 ~/ostechnix 目录。 而且它还在目标目录中保留了相同的目录结构。

您可以在两个位置使用“tree”命令进行验证,如下所示。

在 Linux 中使用 tree 命令列出目录内容

正如您在上面的输出中看到的,目标目录只有 mp3 文件,其目录结构与源目录相同。

如果您从其他位置执行此操作,请指定源目录的完整路径,如下所示。

$ find ~/Linux -name '*.mp3' -exec cp --parents {} ~/ostechnix ;

此命令将找到所有文件 Linux/<子目录> 位置并将它们复制到 ostechnix/~/Linux/<子目录>.

在 Linux 中保留目录结构的同时复制特定文件类型

在 Linux 中保留目录结构的同时复制特定文件类型

如果 – 父母 选项不起作用,您可以将 find 命令与 cpio 命令复制保持目录结构的文件。

$ find . -name '*.mp3' | cpio -pdm  ~/ostechnix

这里,

  • cpio – 将文件复制到档案和从档案中复制的命令。
  • -p – 从标准输入读取文件名列表并将它们复制到指定目录。
  • -d – 在需要的地方创建目录。
  • -m – 保留文件修改时间。

有关更多详细信息,请参阅手册页。

$ man find
$ man cp
$ man cpio

建议阅读:

  • 如何在特定文件夹中自动组织类似类型的文件

方法 2 – 使用 Rsync

同步 是用于/来自本地和远程系统的强大工具。 要在保留父目录结构的同时将某种类型的文件从一个目录复制到另一个目录,请运行:

$ rsync -a -m --include '*/' --include '*.mp3' --exclude '*' ~/Linux/ ~/ostechnix

或者,

$ rsync -a --prune-empty-dirs --include '*/' --include '*.mp3' --exclude '*' ~/Linux/ ~/ostechnix

这里,

  • rsync – 远程(和本地)文件复制工具。
  • -一种 – 存档模式以保留几乎所有内容(包括符号链接、修改日期、文件权限、所有者等)
  • -m, –prune-empty-dirs – 从源树中修剪空目录。 如果要包含空目录,只需从上述命令中删除此选项即可。
  • –include=”*/” –include=”*.mp3″ –exclude=”*” – 要仅包含特定文件,您首先需要包含这些特定文件,然后排除所有其他文件。 在我们的例子中,我们包含了 *.mp3 文件并排除了其他所有文件。
  • ~/Linux – 源目录。
  • ~/ostechnix – 目标目录。

样本输出:

在 Linux 中使用 Rsync 复制特定文件类型同时保持目录结构

在 Linux 中使用 Rsync 复制特定文件类型同时保持目录结构

有关更多详细信息,请参阅手册页。

$ man rsync

希望这可以帮助。