複数のディレクトリ間で共通するファイルのセットを見つけますか?

複数のディレクトリ間で共通するファイルのセットを見つけますか?

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

メルド2 つのディレクトリを比較して、一方のディレクトリにどのファイルが存在し、もう一方のディレクトリにはどのファイルが存在しないかを確認できます。また、共通ファイル間の違いも表示できます。

答え4

3 つのディレクトリ (1 つは現在のディレクトリ、もう 2 つは 'a' と 'b') の場合、次のようにテストを連鎖できます。

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

ファイルに共通のパターン (.php など) があり、ファイル名に空白が含まれていない場合。

スクリプトで使用するlsと常に問題が発生するため、通常は使用をお勧めしませんが、検索を開始するディレクトリ内のすべてのファイルの概要があり、空白や「*」や「?」、「<」や「|」などの特殊文字が含まれていない場合は、使用しても問題ありません。

関連情報