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


418

두 개의 파일이 있습니다 : file1file2. 어떻게의 내용을 추가 할 file2file1의 내용이 너무 file1과정을 지속?

답변:


610

사용 bash는 내장 리디렉션 (tldp) :

cat file2 >> file1

2
대상 파일은 어떻게 소유하지 않으며 sudo를 사용해야합니까?
Bijay Rungta

1
@ BijayRungta : 당신이 당신의 자신의 질문에 대답 한 것 같습니다. 당신은 사전 펜던 것 sudo받는 cat명령 (메시지가 나타나면 자격 증명을 입력).
David

chmod 777 / etc / default / docker는 파일에 대한 쓰기 권한을 부여하기 위해 한 번 수행 한 이전 파일 권한을 복원해야합니다.
danday74

1
@Sigur : 출력을 한 번에 두 개의 파일로 보내는 방법이 없다면 명령을 두 번 호출해야합니다.
David

2
@Sigur 또는 tee프로그램을 살펴보십시오 : cat 1 | tee -a 2 3. --append(또는 -a짧게) 스위치 뒤에 원하는만큼 파일을 넣을 수 있습니다 .
Stefan van den Akker

291

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 경로 재 지정을 설정 한 다음 명령을 찾고, 아무것도 찾지 않고 작업을 완료합니다.


17
@asir-시도하지 마십시오 cat file1 file2 > file1-아마도 당신이 기다리고있는 것처럼 작동하지 않습니다.
eumiro

5
실제로 이것은 그가 필요한 것입니다. "현재 파일 1을 덮어 쓰지 않고"라고 말합니다. 처음 세 답변자는 완전히 질문의이 부분을 무시하고 사용하여 명령 제안 >>하는 것입니다 파일을 수정을 file1. T.Rob은 사실 부정확 한 것을 제출하기 위해 경주하는 것보다 그의 대답을 설명하는 데 훨씬 뛰어난 일을했습니다. 질문의 텍스트를 바탕으로 cat file1 file2 > file3@asir이 찾고있는 적절한 명령 이라고 생각합니다 .
dm78

친절한 말 고마워, 데이빗! @eumiro가 위에서 지적했지만 자세히 설명하지 않은 것은 오른쪽의 작업 >이 먼저 실행 된다는 것 입니다. 따라서 cat file1 file2 > file1먼저 clobber file1을 실행 하면 길이가 0 인 파일을 자체에 복사하려고 시도합니다. 이는 작업이 발생할 수있는 순서와 수행해야하는 순서에 대해 생각할 때 의미가 있지만 미묘하여 많은 사람들을 놀라게 할 수 있습니다. 그래서 다른 것이 없다면, 유미로와 당신은 대답을 더 향상 시켰습니다. 고마워요!
T.Rob

또한 cat file1 >> file1을 시도 하지 마십시오. 이로 인해 파일이 재귀 적으로 다시 작성됩니다. 실수 로이 작업을 수행하면 몇 초 안에 5 천만 줄이 이전에 수십 줄에서 파일에 입력되었습니다.
Hendra Uzia

또한 "새 파일"이 이미 존재하는 경우 좀 더 간결하게 하기 위해 파일에 >> 추가 하고 파일을 > 바꿉니다 .
rinogo

43

참고 : sudo 를 사용해야하는 경우 다음을 수행하십시오.

sudo bash -c 'cat file2 >> file1'

sudo권한 에스컬레이션이 출력 경로 재 지정으로 전달되지 않기 때문에 명령 앞에 추가 하는 일반적인 방법 은 실패합니다.


6
이것에 대한 또 다른 일반적인 관용구는cat file2 | sudo tee -a file1 > /dev/null
ianw


13

참고로 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 버전을 확인하십시오 .


1
신규 사용자의 이익을 위해 : ddrescue는 GNU 도구이지만 Linux, Mac 또는 기타 유닉스 계열 시스템에는 없을 수 있습니다. ddrescue는 POSIX 또는 다른 표준에 필요하지 않은 것으로 보입니다.

2

다른 해결책 :

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

0

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

find / cat 콤보 명령에 대해보고하는 시간 절약은 파일 이름을 인쇄하는 find 명령의 타이밍 만 지정하기 때문입니다. 다음 time (find . -maxdepth 1 -type f -name 'bigFile*' -print0 | xargs -0 cat -- > outFile1)과 같이 전체 명령의 타이밍 을 설정하십시오. 그러면 고양이 전용 명령과 비슷한 결과가 나타납니다.
JoshMc

0

cat솔직히 cat더 읽기 쉽지만 이 작업을 수행하지 않고도이 작업을 수행 할 수 있습니다 .

>> file1 < file2

>>추가 STDIN을file1하고이 <덤프 file2STDIN .



@ user202729 당신 말이 맞아, bash에서는 작동하지 않는다. zsh에서 작동합니다.
Alok Singh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.