見つからないファイルがあるかどうかを2つのフォルダーと比較する

見つからないファイルがあるかどうかを2つのフォルダーと比較する

各フォルダには同じファイル名を持つ2つの異なるフォルダがあり、フォルダの1つにファイルがありません。 2つのフォルダを比較し、Folder1そこに含まれているFolder2欠落しているファイルを一覧表示するにはどうすればよいですか?Folder2Folder1

答え1

$ tree
.
|-- dir1
|   |-- file1
|   |-- file2
|   |-- file3
|   |-- file4
|   `-- file5
`-- dir2
    |-- file2
    |-- file4
    `-- file5

2 directories, 8 files
$ for f1 in dir1/*; do f2="dir2/${f1#dir1/}"; [ ! -e "$f2" ] && printf '%s\n' "$f2"; done
dir2/file1
dir2/file3

これは、最初のディレクトリのすべての名前を繰り返し、各名前に対して2番目のディレクトリにあると予想されるファイルの対応する名前を作成します。ファイルが存在しない場合は、その名前が印刷されます。

ループはさらに詳細に書き込まれました(basenameパラメータ置換の代わりに使用して、最初のディレクトリにあるファイルのパス名からディレクトリ名を削除します)。

for f1 in dir1/*; do
    f2="dir2/$( basename "$f1" )"
    if [ ! -e "$f2" ]; then
        printf '%s\n' "$f2"
    fi
done

両方のディレクトリにあるファイルの名前が同じであるだけでなく、内容も同じである場合は、次のものを使用できますdiff(注:diffここではBSDが使用されており、GNUにはdiff異なる単語が含まれている場合があります)。

$ diff dir1 dir2
Only in dir1: file1
Only in dir1: file3

同じ名前のファイルのファイル内容が異なる場合は、興味のない追加データがたくさん出力されます。 diff -qこの場合、もう少し静かになることがあります。

diffシステムのマニュアルも参照してください。


より深い階層を比較するには、次を使用できますrsync

$ rsync -r --ignore-existing -i -n dir1/ dir2
>f+++++++++ file1
>f+++++++++ file3

上記は各ファイルに1行を出力し、dir1このファイルの下にはそのファイルはありませんdir2。オプション-n--dry-run)は、ファイルが実際に転送されないようにしますdir2

オプション-r--recursive)はジョブを再帰的に作成し、-i--itemize-changes)は特定の出力形式を選択します(>fプラス記号はファイルが受信側で新しいものであることを示します)。

rsyncマニュアルも参照してください。

関連情報