중복 가능성:
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가 사라졌습니다.