명령 출력을 텍스트 파일에 추가하고 있습니다. 그런데 이 작업을 다시 수행하면 텍스트 파일에 동일한 텍스트가 두 번 나타납니다. 예를 들어 특정 단어가 이미 존재하는 경우 새 단어를 추가하지 않고 이전 단어만 바꾸는 방법이 있습니까?
내가 하고 있는 일은 ls 명령의 출력을 텍스트 파일에 추가하는 것입니다. 따라서 때로는 새 파일을 텍스트 파일에 추가해야 하지만 ls 출력을 다시 추가하면 이제 텍스트 파일에 이미 있던 파일이 두 번 나타납니다.
내 말이 무슨 뜻인지 이해하시기 바랍니다.
저는 AWS 리눅스 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
물론 문제는 파일을 매번 삭제하고 다시 생성하면 안되는 이유입니다.