コマンド出力とともにテキストファイルを添付しますが、すでに存在する単語を置き換えます(同じテキストを2回追加しないでください)。

コマンド出力とともにテキストファイルを添付しますが、すでに存在する単語を置き換えます(同じテキストを2回追加しないでください)。

コマンド出力をテキストファイルに追加しています。ただし、これをやり直すと、テキストファイルに同じテキストが2回表示されます。たとえば、特定の単語がすでに存在する場合、新しい単語を追加せずに古い単語のみを置き換える方法はありますか?

私がやっていることは、lsコマンドの出力をテキストファイルに追加することです。したがって、時には新しいファイルをテキストファイルに追加する必要がありますが、ls出力を再度追加すると、テキストファイルにすでに存在していたファイルが2回表示されます。

私の言葉がどういう意味か理解してください。

私はAWS Linux AMIを使用しています。

編集する:

使った

ls client_certs/ >> message.txt

私はまだそのコマンドを使用していませんsed。コマンドを 2 回実行すると、次の二重ls名称が表示されます。

  • 最初の後ls client_certs/ >> message.txt
    1. 2. 3.
    
  • 2回目以降ls client_certs/ >> messages.txt
    1. 2. 3. 1. 2. 3
    

私が望むもの:

  • 初めてこれを行う場合ls client_certs/ >> message.txt
    1. 2. 3.
    
  • これを2回目に実行すると、次のようになりますls client_certs/ >> message.txt
    1. 2. 3.
    
  • client_certs/(たとえば)新しいファイルがあり、4.これを実行したい場合は、ls client_certs/ >> message.txt次のようにする必要があります。
    1. 2. 3. 4.
    

答え1

touch message.txt # the file must exist even if it is empty
ls client_certs | grep -vxFf message.txt >>message.txt
  • -xF全文(正規表現を除く)行の確認
  • -f message.txtファイルのすべての行を確認してください。message.txt
  • -v一致を反転します。つまり、ファイルのすべての内容を印刷するのではなく、ファイルにないすべての内容を印刷します。

古いアイテムを削除

最も簡単な解決策は、ディレクトリとファイル内のアイテムの数を数えることです。数値が異なる場合は、ファイルを削除して再作成します。

touch message.txt # the file must exist even if it is empty
ls client_certs | grep -vxFf message.txt >>message.txt
# update the file, then compare
# save some time by trusting mtime
if [ client_certs -nt message.txt ] && [ $(wc -l message.txt) -ne $(ls -U client_certs | wc -l) ]; then
    : >message.txt # set file size to 0
    ls client_certs | grep -vxFf message.txt >>message.txt
fi

もちろん、問題はファイルを毎回削除して再生成しない理由です。

関連情報