仅为特定类型的文件区分目录
1. 概述
作为系统管理员,我们经常会因为一些不可预见或不可避免的原因而遇到备份失败。为了纠正这个问题,我们可能需要知道备份过程中失败的文件或文件夹列表并重新启动它。
所以现在,本教程阐述了识别两个目录之间特定文件类型的差异。事不宜迟,让我们深入了解它的细节。
2. 使用diff命令
一般我们使用*diff 命令来识别两个文件之间的差异。此外,我们还可以使用它来获取目录之间的差异。在这里,我们将探讨如何使用diff*命令来比较两个目录的内容。
2.1. 示例目录和文件
现在,让我们看一下我们将在整篇文章的解释中使用的目录和文件:
$ tree
├── custom_patterns.txt
├── dir1
│ ├── 1.jpg
│ ├── 2.jpg
...
... output truncated ...
...
│ ├── output.xml
│ ├── sub-dir1
│ │ └── 1.png
│ ├── tbundle.gz
└── dir2
├── 2.jpg
...
... output truncated ...
...
└── ybundle.gz
5 directories, 23 files
为了简单和易于理解,我们将使用diff来快速比较两个目录,如下所示:
$ diff dir1 dir2
Only in dir1: 1.jpg
Only in dir2: family.jpg
diff dir1/make.xml dir2/make.xml
1d0
< new line added here.
Common subdirectories: dir1/sub-dir1 and dir2/sub-dir1
Only in dir2: sub-dir2
Only in dir1: tbundle.gz
Only in dir2: yahoo.jpg
Only in dir2: ybundle.gz
此外,diff 命令中的选项*-s*可以快速报告目录中相同和不同的文件或文件夹,包括内容差异。 现在,我们将在本文中关注文件级和文件夹级的差异:
$ diff -s dir1 dir2
Only in dir1: 1.jpg
Files dir1/2.jpg and dir2/2.jpg are identical
Files dir1/3.jpg and dir2/3.jpg are identical
Only in dir2: family.jpg
...
... output truncated ...
...
Common subdirectories: dir1/sub-dir1 and dir2/sub-dir1
Only in dir2: sub-dir2
Only in dir2: ybundle.gz
简而言之,输出说明:
- 文件1.jpg 和tbundle.gz仅在dir1中可用, 但在dir2中不可用,而family.jpg、yahoo.jpg和ybundl2.gz仅在dir2中可用,而在dir1中不可用。
- 有两个常见的子目录,sub-dir1和sub-dir2,但后者仅在目录dir2中可用。
- 两个目录中都存在的make.xml中的内容不同。然而,我们可以通过使用grep模式来抑制这些内容级别的差异。
2.2. 基于模式的过滤
当我们使用diff命令时,它会显示目录之间的全部差异。假设我们需要对文件类型的可用性进行更集中的比较。在这种情况下,我们使用*-x*选项从比较中排除不需要的文件类型:
$ diff -x '*.xml' -x '*.jpg' dir1 dir2
Only in dir1: tbundle.gz
Only in dir2: ybundle.gz
我们可以通过命令或通过文件提供排除模式列表。对于后者,我们使用*-X*选项后跟包含要排除的所有模式的文件路径。
让我们为文件custom_patterns.txt添加两个模式,用于xml和gz文件:
$ cat custom_patterns.txt
*.xml
*.gz
现在,我们可以运行一个diff命令,输出目录之间文件级别和内容级别的差异。它排除了custom_patterns.txt文件中的文件类型模式:
$ diff -X custom_patterns.txt dir1 dir2
Only in dir1: 1.jpg
Only in dir2: family.jpg
Only in dir2: yahoo.jpg
因此,它通过排除所有*.xml和*.gz文件来识别其余文件类型之间的差异:
现在,假设我们有一个应用程序目录,其中包含程序、二进制文件和日志文件以及其他类型。借助此选项,我们可以通过排除二进制文件和日志文件来快速识别程序文件及其内容之间的差异。
或者,我们可能只想包含目录中可用的一些特定文件。这可以在grep命令的帮助下轻松实现:
$ diff dir1 dir2 | grep ".gz"
Only in dir1: tbundle.gz
Only in dir2: ybundle.gz
3. 使用find命令
*find *是一个命令行实用程序,可帮助从给定路径识别文件或目录。此外,它在搜索文件和目录方面提供了更大的灵活性。
** find实用程序的*-exec 选项有助于对已识别的文件或文件夹执行另一个 Linux 命令*。例如,让我们使用diff命令补充dir2路径:
$ find . -name "*.jpg" -exec diff {} ../dir2/{} \;
diff: ../dir2/./1.jpg: No such file or directory
$ diff ../dir1/ ../dir2 | grep jpg
Only in ../dir1/: 1.jpg
Only in ../dir2: family.jpg
Only in ../dir2: yahoo.jpg
在这里,我们从dir1执行这个find命令。因此,与dir2相比,输出仅显示dir1中不存在的内容,反之则不然。