![파일 자체를 "cat"하면 파일이 삭제되는 이유는 무엇입니까? [복사]](https://linux55.com/image/43506/%ED%8C%8C%EC%9D%BC%20%EC%9E%90%EC%B2%B4%EB%A5%BC%20%22cat%22%ED%95%98%EB%A9%B4%20%ED%8C%8C%EC%9D%BC%EC%9D%B4%20%EC%82%AD%EC%A0%9C%EB%90%98%EB%8A%94%20%EC%9D%B4%EC%9C%A0%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F%20%5B%EB%B3%B5%EC%82%AC%5D.png)
중복 가능성:
IO 리디렉션 및 헤드 명령
첫 번째 줄을 제외하고 파일의 모든 내용을 삭제하고 싶습니다. 나는 이걸했다:
head -1 foo.txt
...그리고 첫 번째 줄만 보이는지 확인하세요. 그런 다음 나는 다음을 수행했습니다.
head -1 foo.txt > foo.txt
그러나 이제 더 이상 첫 번째 행만 포함되지 않고 foo.txt
비어 있습니다.
이로 인해 cat foo.txt > foo.txt
파일도 지워졌습니다.
왜?
답변1
쉘이 데이터 처리를 시작하기 전에 모든 입력과 출력이 제곱되었는지 확인해야 합니다.
따라서 귀하의 경우 > foo.txt
기본적으로 사용은 시스템에 "이름이 지정된 (새) 파일을 만들고 foo.txt
이 명령의 모든 출력을 해당 파일에 붙여넣습니다"라고 지시합니다.
아시다시피 문제는 이전 내용이 지워진다는 것입니다.
관련된, >>
것입니다추가의기존 파일에.
고쳐 쓰다:
이것은 사용된 솔루션입니다 sed
. 주의해서 다루십시오.
sed -i '2,$d' foo.txt
"마지막"까지 2번째 줄을 삭제합니다.제자리에파일에 foo.txt
. 엉망으로 만들 수 있는 파일에서 먼저 시도해 보는 것이 좋습니다. :)
이 명령의 약간 수정된 버전은 .bak
다음 확장명을 사용하여 원본 버전의 복사본을 유지합니다.
sed -i.bak '2,$d' foo.txt
명령줄 스위치 뒤에 -i
"백업"(즉, 원본) 파일의 이름으로 일련의 문자(또는 단일 문자)를 지정할 수 있습니다.
답변2
호출하는 쉘이 cat
로 표시된 리디렉션을 수행하기 때문입니다 >
.
쉘(bash, zsh, ksh, dash 등)은 명령을 읽습니다 cat foo.txt > foo.txt
. 쉘은 로 표시된 리디렉션을 설정해야 합니다 > foo.txt
. >
맨 위에서부터 파일을 쓰는 것을 의미하며, >>
foot.txt에 추가하는 것을 의미합니다.
쉘이 실제로 cat
실행되면 foo.txt가 사라졌습니다.