두 개의 파일이 있습니다 : file1
및 file2
. 어떻게의 내용을 추가 할 file2
에 file1
의 내용이 너무 file1
과정을 지속?
답변
사용 bash는 내장 리디렉션 (tldp) :
cat file2 >> file1
답변
cat file2 >> file1
>>
연산자는 지정된 파일의 출력을 추가하거나 존재하지 않는 경우 지정된 파일을 생성한다.
cat file1 file2 > file3
이것은 둘 이상의 파일을 하나로 연결합니다. 필요한만큼 소스 파일을 가질 수 있습니다. 예를 들어
cat *.txt >> newfile.txt
업데이트 20130902
의견에서 유미로는 “시도하지 마십시오”라고 제안합니다 cat file1 file2 > file1
. 이것이 예상 된 결과를 얻지 못할 수있는 이유는 왼쪽의 명령 >
이 실행 되기 전에 경로 재 지정을받는 파일이 준비 되었기 때문입니다. 이 경우, 먼저 file1
, 그 제로 길이로 절단되고, 출력을 위해 개방 cat
지금 길이 제로 플러스 파일의 내용을 연결하는 명령 시도 file2
로이 file1
. 그 결과 원본 내용 file1
이 손실되고 그 대신 사본 file2
이 예상과 다를 수 있습니다.
업데이트 20160919
의견에서 tpartee는 지원 정보 / 소스에 대한 링크를 제안합니다. 권위있는 참고를 위해, 친절한 독자를 linuxcommand.org 의 sh 매뉴얼 페이지 로 안내합니다.
명령이 실행되기 전에 셸이 해석하는 특수 표기법을 사용하여 입력 및 출력을 리디렉션 할 수 있습니다.
그것은 독자에게 그들이 알아야 할 것을 알려주는 반면, 당신이 그것을 찾지 않고 단어별로 문장을 파싱하지 않으면 놓치기 쉽습니다. 여기서 가장 중요한 단어는 ‘전’입니다. 명령이 실행 되기 전에 리디렉션이 완료되거나 실패합니다 .
cat file1 file2 > file1
쉘 의 예제의 경우, 먼저 명령이 실행되기 전에 I / O 핸들이 실행되는 환경에 I / O 핸들이 위치하도록 경로 재 지정을 수행합니다.
리디렉션 우선 순위가 긴 친숙한 버전은 Ian Allen 웹 사이트에서 Linux 코스웨어 형태로 찾을 수 있습니다. 그의 I / O Redirection Notes (I / O 리디렉션 노트) 페이지에는 명령 없이도 리디렉션이 작동한다는 관찰을 포함하여이 주제에 대해 할 말이 많습니다. 이것을 쉘에 전달 :
$ >out
… 이름이 지정된 빈 파일을 만듭니다. 쉘은 먼저 I / O 경로 재 지정을 설정 한 다음 명령을 찾고, 아무것도 찾지 않고 작업을 완료합니다.
답변
참고 : sudo 를 사용해야하는 경우 다음을 수행하십시오.
sudo bash -c 'cat file2 >> file1'
sudo
권한 에스컬레이션이 출력 경로 재 지정으로 전달되지 않기 때문에 명령 앞에 추가 하는 일반적인 방법 은 실패합니다.
답변
이 명령을 시도하십시오 :
cat file2 >> file1
답변
참고로 ddrescue를 사용하면 예를 들어 큰 파일이 있고 일시 중지 한 다음 나중에 수행해야하는 경우 작업을 수행 할 수있는 중단 가능한 방법을 제공합니다.
ddrescue -o $(wc --bytes file1 | awk '{ print $1 }') file2 file1 logfile
는 logfile
중요한 비트입니다. Ctrl-C
똑같은 명령을 다시 지정 하여 프로세스를 중단 하고 다시 시작할 수 있으며 ddrescue는 logfile
중단 된 위치부터 읽고 다시 시작합니다. -o A
플래그 바이트에서 시작 ddrescue을 알려줍니다 출력 파일에 ( ). 따라서 크기를 바이트 단위로 추출합니다 ( 원하는 경우 출력을 붙여 넣을 수 있음 ).file1
wc --bytes file1 | awk '{ print $1 }'
file1
ls
주석에서 ngks 가 지적한 것처럼 단점은 ddrescue가 기본적으로 설치되지 않을 것이므로 수동으로 설치해야한다는 것입니다. 다른 합병증은 저장소에있을 수있는 두 가지 버전의 ddrescue가 있다는 것입니다. 자세한 내용은 이 askubuntu 질문 을 참조하십시오. 원하는 버전은 GNU ddrescue이고 데비안 기반 시스템에서는 다음과 같은 이름의 패키지입니다 gddrescue
.
sudo apt install gddrescue
다른 배포판의 경우 패키지 관리 시스템에서 ddrescue 의 GNU 버전을 확인하십시오 .
답변
다른 해결책 :
cat file1 | tee -a file2
tee
다음과 같이 원하는만큼 파일을 추가 할 수있는 이점이 있습니다.
cat file1 | tee -a file2 file3 file3
의 내용을 추가합니다 file1
에를 file2
, file3
하고 file4
.
매뉴얼 페이지에서 :
-a, --append
append to the given FILEs, do not overwrite
답변
cat
쉬운 해결책이 될 수 있지만 큰 파일을 연결할 때 매우 느려집니다 find -print
. 고양이를 한 번 사용해야하지만 구출하는 것입니다.
amey@xps ~/work/python/tmp $ ls -lhtr
total 969M
-rw-r--r-- 1 amey amey 485M May 24 23:54 bigFile2.txt
-rw-r--r-- 1 amey amey 485M May 24 23:55 bigFile1.txt
amey@xps ~/work/python/tmp $ time cat bigFile1.txt bigFile2.txt >> out.txt
real 0m3.084s
user 0m0.012s
sys 0m2.308s
amey@xps ~/work/python/tmp $ time find . -maxdepth 1 -type f -name 'bigFile*' -print0 | xargs -0 cat -- > outFile1
real 0m2.516s
user 0m0.028s
sys 0m2.204s