查找当前目录中的文件,列出脚本中列表的差异

时间:2015-02-18 12:46:30

标签: bash list content-management-system find hosting

我试图找到位于bash脚本中的目录和文件列表的差异,以实现可移植性。

例如,搜索安装了phpBB的目录。将递归目录列表与核心安装文件列表(主题,上传等除外)进行比较。显示其他文件和遗失文件。

到目前为止,我尝试使用diff,comm和tr,其中“参数太长”错误。这可能是由于列表是一个文件列表,它试图比较实际文件而不是列表本身。

脚本中的文件列表看起来像这样(但我愿意采用不同的格式):

./file.php
./file2.php
./dir/file.php
./dir/.file2.php

我正在尝试使用以下其中一项来打印列表:

find ./ -type f -printf "%P\n"

find ./ -type f -print

然后使用您可以想到的任何命令将结果与脚本内的文件列表进行比较。

以下内容很难使用,因为通常要检查1000个文件,每个版本都可以更改列表,每次有新版本更新整个脚本都会很痛苦。

find . ! -wholename './file.php' ! -wholename './file2.php'
find . ! -name './file.php' ! -name './file2.php' 
find . ! -path './file.php' ! -path './file2.php'

由于列表的顺序不同以容纳任何其他文件,因此无法进行直接比较。

我只是难过。我非常感谢任何建议,或者我是否可以指出正确的方向。请求澄清!

2 个答案:

答案 0 :(得分:0)

您可以使用-r命令的diff选项,以递归方式比较两个目录的内容。这样您就不需要命令行上的所有文件名;只是两个顶级目录名称。

它将为您提供丢失的文件,新添加的文件以及已更改文件的差异。许多事情可以通过不同的选择来控制。

如果您的意思是某个地方有预期文件列表,并且只有一个目录要与之进行比较,那么您可以尝试使用tree命令。可以使用tree命令首先创建列表,然后在比较时,您可以在目录上再次运行tree命令,并将其与存储的"预期输出进行比较&# 34;使用diff命令。

答案 1 :(得分:0)

你必须使用coreutils吗?如果是这样的话:

将您的列表放在一个文件中,比如list.txt,每行一个文件路径。

comm -23 <(find path/to/your/directory -type f | sort) \
         <(sort path/to/list.txt) \
         > diff.txt

diff.txt将在path/to/your/directory中的每个文件中有一行不在您的列表中。

如果您关心列表中不在path/to/your/directory的文件,请使用相同的参数执行comm -13

否则,您也可以使用sd(流差异),它不需要排序或处理替换并支持无限流,如下所示:

find path/to/your/directory -type f | sd 'cat path/to/list.txt' > diff.txt

只需反转流以获得第二个要求,如下所示:

cat path/to/list.txt | sd 'find path/to/your/directory -type f' > diff.txt

除了娴熟之外,这个例子可能没有那么多的好处,但仍然会考虑它;在某些情况下,您将无法使用commgrep -Fdiff

这是我写的关于在终端上传播流的blogpost,它引入了sd。