同じファイル名のフォルダが2つありますが、1つにはファイルがありません。 2つのフォルダーFolder1
とFolder2
を比較して、Folder2
に含まれるFolder1
にないファイルを一覧表示するにはどうすればよいですか。
$ 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
マニュアルも参照してください。