파일에 쓰지만 존재하는 경우 덮어 씁니다.


252
echo "text" >> 'Users/Name/Desktop/TheAccount.txt'

파일이 존재하지 않으면 파일을 작성하지만 이미 존재하는 경우 파일을 덮어 쓰도록하려면 어떻게해야합니까? 지금이 스크립트는 추가합니다.


잘 .. 이것은 굉장하다. >>보다 조금 일찍 인정했습니다.
Jokester

답변:


411

* nix 파이프의 작동 방식에 대한 약간의 이해가 도움이 될 것입니다.

간단히 말해서, 경로 >>재 지정 연산자는 지정된 파일의 끝에 행을 추가 >합니다.

echo "text" > 'Users/Name/Desktop/TheAccount.txt'

9
일부 환경은 다음과 같은 것을 허용하지 않습니다 -bash: TheAccount.txt: cannot overwrite existing file.
Tom Russell

16
또한, >>>있는 출력 리디렉션 연산자. 파이프 연산자는 |입니다.
Tom Russell

22
@BrDaHa의 답변을 참조하십시오. >|기존 덮어 쓰기에 사용
Jake

2
그것은 기존 파일 덮어 쓰기하지 않기 때문에이 전혀 정답 아니다
iWizard

4
답변은이 의견들로부터
@Jake

90

Bash에서 noclobber a la를 설정 set -o noclobber한 경우 구문을 사용합니다>|

예를 들면 다음과 같습니다.

echo "some text" >| existing_file

파일이 아직없는 경우에도 작동합니다


  • 클로버가 설정되어 있지 않은지 확인하십시오 : set -o | grep noclobber

  • 이 특수 유형의 연산자에 대한 자세한 설명은 이 게시물을 참조하십시오.

  • 리디렉션 연산자의 전체 목록은 이 게시물을 참조하십시오.


@stimulate bash 쉘을 사용하고 있습니까?
BrDaHa

@BrDaHa> |로 stderr을 리디렉션하는 방법 게다가? 나는 시도했다 &> | 그러나 작동하지 않았습니다.
Tu Bui

@TuBui가 왜 작동하지 않는지 잘 모르겠습니다. 내 컴퓨터에서 &>| file작동합니다. 어떤 쉘과 버전을 사용하고 있습니까? zsh에 대한 @stimulate 둘 다 작동 합니다. bash의 경우에만>|
Griddo

@Griddo 내 셸은 bash 버전 4.3.48 (1)-릴리스입니다. echo "aaa" &>| test.txt오류가 발생 -bash: syntax error near unexpected token |합니다. 내 noclobber가 켜져 있습니다.
Tu Bui

1
@TuBui 분명히 나는 ​​올바르게 테스트하지 않았습니다. 그것은 나를 위해 작동하지 않습니다 ...하지만 설명서에는 어쨌든 가능해야한다고 명시되어 있지 않습니다. echo "aaa" >| test.txt 2>&1다른 쉘 을 고수 하거나 사용해야합니다.
Griddo

40

NylonSmile의 답변 에도 불구하고 "정렬 한"맞습니다. 이 방법으로 파일 을 덮어 쓸 수 없었습니다 .

echo "i know about Pipes, girlfriend" > thatAnswer

zsh: file exists: thatAnswer

내 문제를 해결하기 위해 .. 내가 사용했다 ... >!, 일품 ..

[[ $FORCE_IT == 'YES' ]] && echo "$@" >! "$X" || echo "$@" > "$X"

분명히, 이것을 조심하십시오 ...


26
이는 기본이 아닌 zsh 옵션 NOCLOBBER세트 가 있음을 의미합니다 . setopt clobber 기본 동작을 복원하는 데 사용 합니다.
Michał Politowski

11

환경에서로 덮어 쓰기를 허용하지 않으면 다음과 같이 >파이프 |tee사용하십시오.

echo "text" | tee 'Users/Name/Desktop/TheAccount.txt'

이것은 stdout에도 인쇄됩니다. 원하지 않는 경우 /dev/null다음과 같이 출력을 리디렉션 할 수 있습니다 .

echo "text" | tee 'Users/Name/Desktop/TheAccount.txt' > /dev/null


2

noclobber 설정 (예 :)이있는 동안 std :: cerr 및 std :: cout을 파일로 리디렉션하려는 경우 set -o noclobber코드를 사용할 수 있습니다.

    cmd >|file.txt 2>&1

이에 대한 자세한 내용은 https://stackoverflow.com/a/876242 에서 확인할 수 있습니다 .

또한이 답변이 제공하는 응답 @BrDaHa에 TuBui의 질문 @의 9시 34분에서 8월 9일 '18에서.


0

한 파일의 내용을 다른 파일로 덮어 씁니다. 예를 들어 고양이를 사용하십시오.

echo  "this is foo" > foobar.txt
cat foobar.txt

echo "this is bar" > bar.txt
cat bar.txt

이제 foobar를 덮어 쓰려면 아래와 같이 cat 명령을 사용할 수 있습니다

cat bar.txt >> foobar.txt
cat foobar.txt

여기에 이미지 설명을 입력하십시오


"이제 foobar를 덮어 씁니다 ..."-이 부분 >>은 덮어 쓰지 않고 추가됩니다
Drenai

-2

당신이 오류를 출력 할 수있는 경우에, 당신은 앰퍼샌드 사용할 수 있습니다 다음과 같이보다 더 큰를 :

my_task &> 'Users/Name/Desktop/task_output.log' 그러면 stderr과 stdout이 모두 로그 파일로 리디렉션됩니다 (stdout 대신).


6
사실 일 수도 있지만 질문과 관련이 없습니다.
Deiwin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.