2つのディレクトリがあり、違いをこの形式で出力する必要があります。
例:
DIR1 conatins : file1
file2
file3
DIR2 contains : file1
file4
出力(ファイル名のみ、ファイル内容なし):file1が変更または同じ、file2が削除され、file4が追加されました
答え1
これは簡単な質問です。人気のあるツールを確認してくださいdiff
。
diff -r dir1 dir2
編集:OPの質問が間違っています。情報を入手してください。それ代わりにファイルが異なります。どのように異なるため、次のオプションを使用する必要があります-q
。
diff -r -q dir1 dir2
答え2
comm
join
ETなどのツールが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つがまだ空にならない可能性があるため、必要に応じてその配列に名前を出力します。