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