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

时间:2020-03-21 11:43:10  来源:igfitidea点击:

本简要教程解释了如何在保持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

在上面的目录结构中看到,Linux目录具有四个子目录,即DIR1,DIR2,DIR3和DIR4.
MP3文件分散在所有四个子目录中。
现在,我想将所有mp3文件复制到名为"oniTorad"的另一个目录,也希望在目标目录中保持相同的目录结构。

首先,我们将看到如何使用"查找"命令来执行此操作。

方法1 - 使用"查找"和"CP"或者"CPIO"命令保留目录结构的同时复制特定文件类型

转到源目录:

$cd Linux/

并使用"查找"命令复制所有MP3 FIE类型:

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

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

  • find - 命令在Unix的系统中查找文件和文件夹。
  • DOT(。) - 表示我们将内容从当前目录复制。
  • -iname'* .mp3' - 搜索与扩展名.mp3匹配的文件。
  • -exec cp - 执行'cp'命令将文件从源复制到目标目录。
  • --parents - 如果需要,创建中间父目录以保留父目录结构。
  • \ {} - 将自动替换为"查找"命令的文件的文件名。并且括号被逃脱以保护它们免受shell扩展在一些"查找"命令版本中。我们也可以使用{}而不逃生字符。
  • ~/InitRoad - 要保存匹配文件的目标目录。
  • \ - 表示要执行的命令现在已完成,并在下一个匹配上再次执行命令。

此命令将找到并将所有MP3类型文件从~/linux目录复制到~/onitad目录。
并且它保留目标目录中的目录结构。

我们可以使用下面的两个位置使用"树"命令验证。

如上所述,目标目录只有MP3文件,其目录结构与源目录相同。

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

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

此命令将在Linux/<子目录>位置中找到所有文件,并将它们复制到OniTorad /~/Linux/<子目录>。

如果--parents选项不起作用,则可以使用cpio命令组合查找命令以复制保存目录结构的文件。

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

其中

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

有关更多详细信息,请参阅Man页面。

$man find
$man cp
$man cpio

方法2 - 使用rsync保留目录结构的同时复制特定文件类型

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

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

或者,

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

其中

  • rsync - 远程(和本地)文件复制工具。
  • -a - 归档模式要保留几乎所有内容(包括符号链接,修改日期,文件权限,所有者等)
  • -m, - 浏览器 - 来自源树的Prune空目录。如果要包含空目录,请从上面的命令中删除此选项。
  • --include ="* /"--include ="。mp3"--exclude ="" - 仅包含特定文件,首先需要包含这些特定文件,然后排除所有其他文件。在我们的情况下,我们已包含* .mp3文件并排除其他所有内容。
  • ~/Linux - 源目录。
  • ~/onitad - 目标目录。