[linux] 쉘에서 Linux의 파일을 다른 파일에 추가하는 방법은 무엇입니까?

두 개의 파일이 있습니다 : file1file2. 어떻게의 내용을 추가 할 file2file1의 내용이 너무 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을 알려줍니다 출력 파일에 ( ). 따라서 크기를 바이트 단위로 추출합니다 ( 원하는 경우 출력을 붙여 넣을 수 있음 ).file1wc --bytes file1 | awk '{ print $1 }'file1ls

주석에서 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