差集合演算をshellで行う(aとbの差分のうちaのみに存在する要素を出力)
リレーショナルデータベースでいうEXCEPT
をシェルコマンドで実現します。
SELECT id FROM a
EXCEPT
SELECT id FROM b;
それぞれa.txt
、b.txt
に集合の中身が書かれているとします。ここで、a-b
(a.txt
にはあるが、b.txt
にはないもの)を出力するには、下記コマンドを実行します。
cat b.txt b.txt a.txt | sort | uniq -u
具体例
a.txt
aaa
bbb
cccc
dddd
txt.b.txt
cccc
dddd
ee
ff
aaa
bbb
より実践的な具体例
~/work
ディレクトリと~/backup
ディレクトリの差分を確認し、~/backup/
されていないファイルを出力します。削除されたファイルは~/backup/
にあっても良しとします。(この場合だったらrsync -av --dry-run ~/work/ ~/backup/
でも良いのかも。)
cd ~/work
ls
# > aaa bbb cccc dddd
find . -type f > ../work_filelist.txt
cd ~/backup
touch cccc dddd ee ff
find . -type f > ../backup_filelist.txt
cat backup_filelist.txt backup_filelist.txt work_filelist.txt | sort | uniq -u >need_copy.txt