あるディレクトリ内のすべてのファイルを別のディレクトリにはないLinux/Unixツールはありますか?基本的に私はlsの出力で動作するdiffを探しています。
短くて甘いスクリプトも大歓迎です。
diff
はすでにこれを行っています:
diff dir1 dir2
出力例:
Only in dir1: some_file.txt
Only in dir1: some_other_file.txt
Only in dir2: third_file.txt
バッシュ:
diff <(cd dir1; ls) <(cd dir2; ls)
ファイル名のみを比較し、ファイルの内容は比較しません。
人々がここであなたに言ったように、さまざまな使用法のバリエーションでDIFFを使用できます。または、代わりにdirdiff
を使用するだけです。 :-)
しかし、いくつかのディレクトリを同期させておきたい場合は、rsync
を実際に確認する必要があります。
よろしく
すべてのサブディレクトリでもこれを実行したい場合、それを行うための良い方法は次のとおりです。
diff --brief -r dir1/ dir2/
私はブリーフを使用することを好みますが、必要に応じて省略できます。
for i in $(ls -1 directory1); do if (test -f directory2/$i) then echo $i; fi; done
デニスウィリアムソンには 良い答え がありましたが、これを再帰的に行う必要がありました。 GNU findutils 4.7.0は出力をソートしないので、ここで私が使用したものです
diff <(cd $dir1; find | sort) <(cd $dir2; find | sort)
これを1つの方法で行い、ファイルのリストを作成するには、次のようにしました。
diff <(cd $dir1; find | sort) <(cd $dir2; find | sort) \
| grep '< ./' | sed "s,< ./,$dir1/,"
これが正しく機能するためには、$ dir1と$ dir2のどちらにも末尾のスラッシュを含めないでください。
これは機能します。
ls -a1 /dir1 | sort > /tmp/1
ls -a1 /dir2 | sort > /tmp/2
diff /tmp/1 /tmp/2
未テスト:
find /dir/A -printf "%P" | while read f; do
if [ ! -e "/dir/B/$f" ]; then
echo $f
fi
done