파일에 추가하는 대신 파일 내용을 계속 덮어쓰는 방법

파일에 추가하는 대신 파일 내용을 계속 덮어쓰는 방법

파일에 쓰기 전에 파일 내용을 지우는 방법은 무엇입니까? 예를 들어:

echo one > filename.tmp
# filename.tmp now contains "one"

echo two > filename.tmp
# filename.tmp should now contain "two", not "one" and "two"

내 목표는 다음과 같습니다

  1. 리스너 시작

    $ nc -l 7007 > /var/tmp/test.log
    
  2. 데이터 좀 보내

    $ telnet localhost 7007
    hi
    second_word
    
  3. 테스트 파일

    $ cat /var/tmp/test.log
    second_word
    

나는 "hi"가 로그에 나타나는 것을 원하지 않습니다. 나는 그것을 "second_word"로 대체하고 싶습니다.

답변1

nc에서는 해당 옵션을 제공하지 않기 때문에 새 파일을 지우고 쓰려면 별도의 프로그램이 필요합니다.

nc -l 7007 | while true; do
    while read line; do
      echo "$line" > /tmp/test
    done
done

파일 경로를 허용하는 별도의 스크립트에서 파이프 뒤의 모든 내용을 저장할 수 있습니다.

마지막 줄을 저장하세요.sh

while true; do
    while read line; do
        echo "$line" > $1
    done
done

그렇다면 매우 간단합니다.

nc -l 7007 | save-last-line.sh /var/tmp/test.log

$1쓰기 가능한지 확인하고 지정되지 않은 경우 사용법을 표시하려면 검사를 추가해야 합니다 $1.

답변2

command > /path/to/file파일이 지워지고 출력이 command해당 파일에 기록됩니다.

때를아니요이 파일을 지우고 싶습니다. 입니다 command >> /path/to/file.

한 가지 주목할 점은 noclobber셸의 옵션입니다. >연산자를 사용하여 파일을 지우는 것을 방지합니다 . 재정의를 사용하여 이 옵션을 재정의 >!하거나 설정을 해제 할 수 있습니다 set +o noclobber.

명령줄에서 다음을 시도해 보세요.

# echo "Hello, " > /tmp/test
# cat /tmp/test
  Hello
# echo "U&L" > /tmp/test
# cat /tmp/test
  U&L
# echo "Hello," > /tmp/test
# echo "U&L" >> /tmp/test
# cat /tmp/test
  Hello,
  U&L
# 

관련 정보