

とあるアーカイブを保存するディレクトリに今日の保存ファイルリストを取得する機能と  
diffコマンドで、先日の保存ファイルリストと本日の保存ファイルリストをくらべて、  
先日存在して本日存在しない差分を抽出するシェルを作りたいです。

しかしdiffコマンドで差分を抽出するとどちらのファイルの差分も抽出してしまいます。  
色々diffオプションを探してもだめでした。

Aのあるなしは無視して、BにあってAにない差分を表示するdiffコマンドはどうすれば作れますでしょうか？


CC BY-SA 4.0
2019-10-21T23:50:24.227
59857
2019-10-22T13:49:07.730
36290
question
shell
diffコマンドにて先日存在して本日存在しない差分を抽出するシェルを作りたい


先日(B)存在して、本日(A)存在しない差分  
※「Aのあるなしは無視して」の条件が何を意味すのか分かりませんでした。

先日のリストB.txt

[code]

    d
    c
    b
    a
    
[/code]

本日のリストA.txt

[code]

    a
    c
    e
    
[/code]

のとき、`b`と`d`が存在しなくなり、`e`が新規に登場します。  
「このとき、`b`と`d`を抽出したい」ということでしょうか？

そうであれば  
diff <(sort A.txt) <(sort B.txt)

[code]

    1a2
    > b
    3c4
    < e
    ---
    > d
    
[/code]

の  
`>`で始まる行を抽出すればよいと思います。

【手順】

[code]

    diff <(sort A.txt) <(sort B.txt) | grep '^>' | sed 's/^> //'
    
[/code]

【結果】

[code]

    b
    d
    
[/code]

【実行した環境】  
GNU bash, バージョン 4.4.20(1)-release (x86_64-pc-linux-gnu)  
diff (GNU diffutils) 3.6  
grep (GNU grep) 3.1  
sed (GNU sed) 4.4  
sort (GNU coreutils) 8.28


CC BY-SA 4.0
2019-10-22T01:41:06.793
59861
2019-10-22T01:41:06.793
35558
59857
answer


commコマンドというソートされた２つのファイルに対してそれぞれのファイルだけに存在する行と共通の行に分類するコマンドがあります。(diffコマンドを使うことにこだわりがなければ…。)  
commコマンドは行がソートされたファイルを与える必要があります。(質問の文面から推察するとソートしても構わないファイルのように思えますが、実際そうであるかは確認する必要があります。)

まず次のコマンドで、A.txtのみに存在する部分、B.txtのみに存在する部分、共通部分に  
分けることができますので、確認してみてください。

[code]

    comm <(sort A.txt) <(sort B.txt)
    
[/code]

オプションを指定して3つの部分のうち必要なものだけを出力することができます。A.txtのみに存在する部分だけを出力するには「-23」を指定します。

[code]

    comm -23 <(sort A.txt) <(sort B.txt)
    
[/code]


CC BY-SA 4.0
2019-10-22T05:54:08.377
59867
2019-10-22T05:54:08.377
30745
59857
answer