web-dev-qa-db-ja.com

不足しているファイルがないか2つのフォルダーを比較する

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

2
Teddy291
$ 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

2つのディレクトリ内のファイルが同じ名前であるだけでなく、同じ内容でもある場合は、diffを使用できます(注:BSD diffここで使用、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

上記は、dir1の下に対応するファイルがないdir2の下の各ファイルの行を出力します。 -nオプション(--dry-run)は、実際にdir2に転送されるファイルがないことを確認します。

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

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

3
Kusalananda