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


9

Drupalテーマのディレクトリを比較したいと思っています。drupalテーマはいくつかのファイルで構成されるディレクトリであり、どのファイルが必須かを理解しようとしています。例えば、それらはすべてというファイルがある可能性がありますtemplate.phppage.tpl.php

複数のディレクトリのすべての共通ファイルのセットを見つけるにはどうすればよいですか?私の場合、すべての「同じ」ファイル(同じ名前のファイル)は同じレベルのディレクトリに置かれます。


ukuug.org/newsletter/10.4の「Shell Puzzle」セクションにいくつかの回答があります(ただし、それらはshell-golf風です)。
James Youngman

回答:


7

すべてのディレクトリに共通のファイルのすべての名前(パスではない)をリストします。

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"

1

名前が表示されるディレクトリの数でソートされた名前のリストを表示できます。

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

0

メルド次の2つのディレクトリを比較し、いずれかではなく、他のと、その逆に存在するファイルを確認することができます。また、共通ファイル間の違いを示すこともできます。


0

3つのディレクトリの場合、1つは現在、2つは「a」と「b」で、次のようにテストをチェーンできます。

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

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

lsスクリプトでの使用は常に問題があり、通常は使用しないようにしますが、検索が開始されるディレクトリ内のすべてのファイルの概要があり、空白や「*」や「?」などの特殊文字が含まれていない場合"、" <"または" | "、それを使用するには保存する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.