複数のディレクトリ間の共通ファイルセットをお探しですか?

複数のディレクトリ間の共通ファイルセットをお探しですか?

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常に問題があり、通常は使用をお勧めしません。ただし、検索が開始されるディレクトリ内のすべてのファイルの概要があり、スペースまたは "*" または "?" そのような特殊文字。 "、"<"または"|"は使用前に保存する必要があります。

関連情報