找到几个目录之间的公共文件集?

找到几个目录之间的公共文件集?

我正在寻找比较 Drupal 主题的目录。 drupal 主题是一个由多个文件组成的目录,我试图找出哪些是必不可少的。例如,它们可能都有一个名为template.php或 的文件page.tpl.php

如何找到多个目录的所有公共文件集?就我而言,所有“相同”文件(同名的文件)都将位于同一级别目录中。

答案1

列出所有目录共有的文件的所有名称(不是路径)。

dirs=( "A dir" "B dir" "C dir" "D dir" )
find "${dirs[@]}" -maxdepth 1 -type f -name "*" -printf '%f\n' |
  sort | uniq -c | sed -n "s/^ *${#dirs[@]} //p"

或者将其作为脚本文件或函数调用,并以目录作为参数。

find "$@" -maxdepth 1 -type f -name "*" -printf '%f\n' |
  sort | uniq -c | sed -n "s/^ *$# //p"

答案2

您可以显示按名称出现的目录数排序的名称列表。

find */ |              # traverse all the template directories
sort -t / -k 2 |       # sort, ignoring the first field
tr '/' '\t' |          # turn / into tabs
uniq -f 1 -c |         # count duplicates, ignoring the first field
tr '\t' '/' |          # turn tabs back into /
sort -t / -s -k 1n     # sort by the number of occurrences

答案3

梅尔德您可以比较两个目录,并查看其中一个目录中存在哪些文件,另一个目录中不存在哪些文件,反之亦然。它还可以显示常见文件之间的差异。

答案4

对于 3 个目录,其中一个是当前目录,以及两个“a”和“b”,您可以像这样链接测试:

ls a/$(ls b/$(ls *.php) 2>/dev/null) 2>/dev/null

如果文件具有通用模式(如 .php)并且文件名中不包含空格。

在脚本中使用ls总是有问题的,我通常不鼓励使用它,但是如果您对搜索开始的目录中的所有文件有一个概述,并且它不包含空格,也不包含像“*”或“?”这样的特殊字符。 "、"<"或"|",需要保存才能使用。

相关内容