2つのディレクトリの違いと完全な詳細を確認してください。

2つのディレクトリの違いと完全な詳細を確認してください。

2つのディレクトリがあり、違いをこの形式で出力する必要があります。

例:

DIR1 conatins :   file1
                  file2
                  file3
DIR2 contains :   file1
                  file4

出力(ファイル名のみ、ファイル内容なし):file1が変更または同じ、file2が削除され、file4が追加されました

答え1

これは簡単な質問です。人気のあるツールを確認してくださいdiffdiff -r dir1 dir2 編集:OPの質問が間違っています。情報を入手してください。それ代わりにファイルが異なります。どのように異なるため、次のオプションを使用する必要があります-qdiff -r -q dir1 dir2

答え2

commjoinETなどのツールが2つのソートされた入力セットを比較する方法をシミュレートするには、次のようにしますbash

# Get lists of (base-)names from both directories.
files1=( dir1/* ); files1=( "${files1[@]##*/}" )
files2=( dir2/* ); files2=( "${files2[@]##*/}" )

# Loop over these sorted lists until one of them is empty.
while [[ ${#files1[@]} -gt 0 ]] && [[ ${#files2[@]} -gt 0 ]]; do
        name1=${files1[0]}
        name2=${files2[0]}

        if [[ $name1 == "$name2" ]]; then
                # Name exists in both directories.
                printf '%s is modified or same\n' "$name1"
                files1=( "${files1[@]:1}" )
                files2=( "${files2[@]:1}" )
        elif [[ $name1 < $name2 ]]; then
                # Name exists in only first directory.
                printf '%s is removed\n' "$name1"
                files1=( "${files1[@]:1}" )
        else
                # Name exists in only second directory.
                printf '%s is added\n' "$name2"
                files2=( "${files2[@]:1}" )
        fi
done

# Handle remaining names.
if [[ ${#files1[@]} -gt 0 ]]; then
        printf '%s is removed\n' "${files1[@]}"
fi
if [[ ${#files2[@]} -gt 0 ]]; then
        printf '%s is added\n' "${files2[@]}"
fi

2つの配列を使用してbash各ディレクトリの名前を保持し、配列の1つが空になるまで繰り返します。

ループ内の各配列の名前を互いに比較します。名前が同じ場合は、ファイルが同じか変更されている可能性があります(2つの配列から名前を削除してください)。

最初の配列の名前が2番目の配列の名前の前にある場合(testを使用<)、最初の名前は2番目のディレクトリにありません。次に、最初の配列の最初の要素を削除します。

それ以外の場合、2番目の配列の名前は最初のディレクトリにありません。次に、2番目の配列の最初の要素を削除します。

ループが終了しても配列の1つがまだ空にならない可能性があるため、必要に応じてその配列に名前を出力します。

関連情報