--in-place
나는 시각 장애인인가요, 아니면 와 같은 옵션이 없나요 sort
?
결과를 입력 파일에 저장하기 위해 sed는 -i
( --in-place
)를 사용합니다.
sort
출력을 입력 파일로 리디렉션
sort < f > f
결과적으로 비어 있게 됩니다. 옵션 이 없는 경우 --in-place
- 이를 수행하는 몇 가지 트릭이 있을 수 있습니다.편리한방법?
(내 마음속에 떠오르는 유일한 것은:
sort < f > /tmp/f$$ ; cat /tmp/f$$ > f ; rm /tmp/f$$
이사하는 것은 올바른 선택이 아닙니다.파일 권한변경될 수 있습니다. 그래서 임시파일 내용으로 덮어쓴 뒤 삭제합니다. )
답변1
sort
파일 이름을 인수로 사용하는 -o
(또는 ) 옵션이 있습니다 . --output
프로그램은 데이터를 임시 파일에 쓴 다음 정렬이 완료된 후 원래 입력 파일을 덮어씁니다(이는 모든 입력 데이터를 읽은 후에만 발생합니다). (이것은 본질적으로 done 과 동일합니다 sed -i
.)
GNU sort
정보 페이지 에서 :
-o OUTPUT-FILE
--output=OUTPUT-FILE
-
출력 쓰기결과물 파일표준 출력 대신. 일반적으로
sort
열기 전에 모든 입력을 읽습니다.결과물 파일sort -o F F
이므로 및 같은 명령을 사용하여 파일을 안전하게 정렬할 수 있습니다 cat F | sort -o F
. 그러나 ( )를 sort
사용하면 모든 입력을 읽기 전에 출력 파일을 열 수 있으므로 이와 같은 명령은 읽기가 완료되기 전에 쓰기가 시작될 수 있으므로 안전하지 않습니다 .--merge
-m
cat F | sort -m -o F - G
sort
F
cat
최신 시스템에서는 설정된 경우 -o
입력 파일 뒤에 나타날 수 없습니다. 예를 들어 이식 가능한 스크립트는 입력 파일 앞에 지정되어야 합니다.POSIXLY_CORRECT
sort F -o F
-o OUTPUT-FILE
-o output
-
표준 출력 대신 사용할 출력 파일의 이름을 지정합니다. 이 파일은 입력 파일 중 하나와 동일할 수 있습니다.
sort
디스크 공간이나 디스크 할당량이 부족하거나, 출력 파일을 쓰는 동안 시스템이 충돌하거나 , 기타 오류가 발생하는 경우 sort
데이터의 일부 또는 전체가 삭제(즉, 파기)될 수 있다는 보고가 있습니다 .
즉, 파일을 제자리에서 정렬하려면 다음 명령을 사용할 수 있습니다.
sort -o filename filename
답변2
당신은 그것을 사용할 수 있습니다sponge
stdin
먼저 담근 다음 파일에 쓰는 함수입니다 . 예를 들면 다음과 같습니다.
sort < f | sponge f
단점 sponge
은 출력을 임시로 메모리에 저장하므로 대용량 파일의 경우 문제가 될 수 있다는 것입니다. 그렇지 않으면 먼저 파일에 쓴 다음 원본 파일을 덮어써야 합니다.
그러나 다른 답변에서 지적했듯이 내부 수정은 sponge
프로세스(예: 프로세스) 도중에 컴퓨터가 충돌하여 원본 파일과 새 파일을 모두 잃을 수 있기 때문에 일반적으로 좋은 생각이 아닙니다. 먼저 다른 파일에 쓴 다음 원자(이동) 명령을 사용하는 것이 좋습니다 mv
.
답변3
파일을 쓰는 동안 프로그램이나 시스템이 충돌하면 둘 다 손실되므로 입력 파일을 출력 파일로 덮어쓰는 것은 위험합니다.
일부 프로그램(주로 GNU 버전)에는 내부 옵션이 있습니다(예: -i
Perl 및 GNU sed, -o
GNU 정렬). 그들이 작업하는 방식은 데이터를 임시 파일에 넣은 다음 해당 위치로 옮기는 것입니다.
이 옵션이 없는 프로그램의 경우,콜린 왓슨의 sponge
유틸리티(포함 된Joey Hess의 moreutils)는 모든 프로그램에 대해 이 작업을 자동으로 수행합니다(예:cut
파일을 그 자리에서 변경할 수 있나요 ?;iconv가 입력 파일을 변환된 출력으로 바꾸도록 하려면 어떻게 해야 합니까?). 그러나 실패하더라도 do_stuff | sponge myfile
비어 있거나 잘못된 출력으로 항상 덮어쓰게 됩니다. 파이프로 연결된 명령이 성공했는지 여부를 감지할 수 있는 방법이 없습니다. 따라서 임시 파일을 사용하는 것에 비해 타이핑은 편리하지만 안전하지는 않습니다.myfile
do_stuff
sponge
동일한 권한으로 원본 파일을 다시 만들 수 없는 드문 경우에만 해당 파일을 덮어쓰는 것이 좋습니다. 이 경우 원래 입력을 어딘가에 저장하는 것이 좋습니다. 그런 다음 입력 복사본을 처리하여 원본 파일로 보낼 수 있습니다.
cp -p f ~/f.backup
sort <~/f.backup >|f
rm ~/f.backup # optional
답변4
-o
vim 방식을 사용하거나 시도해 보십시오.
$ ex -s +'%!sort' -cxa file.txt