我正在将命令输出附加到文本文件。但是如果我再次执行此操作,文本文件中将出现两次相同的文本。例如,有没有一种方法,如果某个单词已经存在,则不添加新单词,而只是替换旧单词?
我正在做的是将 ls 命令的输出附加到文本文件。因此,有时必须将新文件添加到文本文件中,但如果再次附加 ls 输出,则文本文件中已有的文件现在会出现两次。
我希望你明白我的意思。
我正在使用 AWS linux AMI
编辑:
我用了
ls client_certs/ >> message.txt
我还没有使用该sed
命令。如果我执行该ls
命令两次,那么我会得到双重名称,例如:
- 第一个之后
ls client_certs/ >> message.txt
:1. 2. 3.
- 第二次之后
ls client_certs/ >> messages.txt
:1. 2. 3. 1. 2. 3
我想要的是:
- 如果我第一次这样做
ls client_certs/ >> message.txt
:1. 2. 3.
- 如果我第二次这样做
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
当然,问题是为什么不应该每次都删除并重新创建该文件。