다섯 파일의 내용을 그대로 하나의 파일로 복사하고 싶습니다. 각 파일마다 cp를 사용하여 시도했습니다. 그러나 이전 파일에서 복사 한 내용을 덮어 씁니다. 나는 또한 시도했다
paste -d "\n" 1.txt 0.txt
그리고 그것은 작동하지 않았다.
스크립트가 각 텍스트 파일 끝에 줄 바꿈을 추가하고 싶습니다.
예. 파일 1.txt, 2.txt, 3.txt. 1,2,3의 내용을 0.txt에 넣습니다.
어떻게합니까?
다섯 파일의 내용을 그대로 하나의 파일로 복사하고 싶습니다. 각 파일마다 cp를 사용하여 시도했습니다. 그러나 이전 파일에서 복사 한 내용을 덮어 씁니다. 나는 또한 시도했다
paste -d "\n" 1.txt 0.txt
그리고 그것은 작동하지 않았다.
스크립트가 각 텍스트 파일 끝에 줄 바꿈을 추가하고 싶습니다.
예. 파일 1.txt, 2.txt, 3.txt. 1,2,3의 내용을 0.txt에 넣습니다.
어떻게합니까?
답변:
출력 파일에 cat
쉘 재 지정 ( >
) 과 함께 (연결을위한 축약 형) 명령 이 필요 합니다.
cat 1.txt 2.txt 3.txt > 0.txt
>>
데 사용 됩니다 . 여기서 출력 파일에 지정된 내용 으로 덮어 씁니다 . 줄 바꿈에 관해서는 파일의 첫 번째 문자로 줄 바꿈이 있습니까? 을 사용 하여 첫 번째 문자가인지 확인하면 찾을 수 있습니다 . >
1.txt
od -c
\n
{...}
파일 이름 일치 형식 을 확실히 허용 하므로 따옴표가 스크립트에서 약간 엉망입니까? 나는 항상 ls
쉘에서 이것을 사용하여 이런 일을 시도 합니다. 명령을 올바르게 받으면 그대로 스크립트에 잘라 붙여 넣습니다. -x
스크립트에서 옵션이 유용 할 수도 있습니다 . 실행 전에 스크립트에서 확장 된 명령을 에코합니다.
내가 한 것처럼이 게시물을 우연히 발견 한 다른 옵션은 다음을 사용하는 것입니다 find -exec
.
find . -type f -name '*.txt' -exec cat {} + >> output.file
필자의 경우 여러 하위 디렉토리를 살펴볼 수있는보다 강력한 옵션이 필요했기 때문에 사용하기로 결정했습니다 find
. 세분화 :
find .
현재 작업중인 디렉토리를 살펴보십시오.
-type f
디렉토리 등이 아닌 파일에만 관심이 있습니다.
-name '*.txt'
이름으로 결과 집합을 정리
-exec cat {} +
각 결과에 대해 cat 명령을 실행하십시오. "+"는 하나의 인스턴스 만 cat
생성됨을 의미합니다 (thx @gniourf_gniourf)
>> output.file
다른 답변에서 설명한 것처럼 출력 내용 끝에 cated 컨텐츠를 추가하십시오.
*.txt
를 따옴표로 묶어야합니다 (그렇지 않으면 find
작성된 전체 명령이 쓸모가 없습니다). 실행 명령이 : 또 다른 결함은 총 오해에서 비롯 되지 않습니다 cat >> 0.txt {}
,하지만 cat {}
. 귀하의 명령은 실제로 { find . -type f -name *.txt -exec cat '{}' \; ; } >> 0.txt
(그룹화를 추가하여 실제로 무슨 일이 일어나고 있는지 알 수 있습니다)와 같습니다. 또 다른 결점은 find
파일을 찾는 것인데 0.txt
, 입력 파일이 출력 파일cat
이라고 말함으로써 불평 할 것 입니다.
>> output.file
사람 (자신 포함)을 유도하지 않도록 명령의 끝에 두어야 합니다. find
cat {} >> output.file
-exec cat {} +
대신을 사용하여 -exec cat {} \;
하나의 인스턴스 만 cat
여러 인수로 생성되도록하십시오 ( +
POSIX로 지정 ).
find . -type f -exec cat {} + >> outputfile.txt
과 같이 수정했다. 디렉토리가 단지 50 메가인데도 내 출력 파일이 공연장에서 자라지 않는 이유를 알 수 없었다. outputfile.txt를 계속 추가했기 때문입니다! 따라서 파일 이름을 올바르게 지정하거나 파일을 완전히 피하기 위해 다른 디렉토리에 완전히 배치하십시오.
특정 출력 유형이 있다면 다음과 같이하십시오.
cat /path/to/files/*.txt >> finalout.txt
file_1
,, file_2
… file_11
, 파일이 정렬되는 자연스러운 순서 때문입니다.
for i in {1..3}; do cat "$i.txt" >> 0.txt; done
952 파일을 하나로 결합해야했기 때문에이 페이지를 찾았습니다. 파일이 많은 경우이 기능이 훨씬 더 좋습니다. 이것은 당신이 필요로하는 많은 숫자에 대해 루프를 수행하고 0을 사용하여 0.txt의 끝에 추가하기 위해 각각을 사용합니다.
다른 옵션은 sed
다음과 같습니다.
sed r 1.txt 2.txt 3.txt > merge.txt
또는...
sed h 1.txt 2.txt 3.txt > merge.txt
또는...
sed -n p 1.txt 2.txt 3.txt > merge.txt # -n is mandatory here
또는 리디렉션없이 ...
sed wmerge.txt 1.txt 2.txt 3.txt
마지막 줄도 merge.txt
( wmerge.txt
! 아님) 쓰십시오 . w"merge.txt"
파일 이름과 혼동되지 않고 -n
자동 출력에 사용할 수 있습니다 .
물론 와일드 카드를 사용하여 파일 목록을 줄일 수도 있습니다. 예를 들어, 위 예제에서와 같이 번호가 매겨진 파일의 경우 다음과 같이 중괄호로 범위를 지정할 수 있습니다.
sed -n w"merge.txt" {1..3}.txt
원본 파일에 인쇄 할 수없는 문자가 포함되어 있으면 cat 명령을 사용할 때 해당 문자가 손실됩니다. 'cat -v'를 사용하면 인쇄 할 수없는 문자가 표시 가능한 문자열로 변환되지만 출력 파일에는 여전히 원본 파일의 실제 인쇄 할 수없는 문자가 포함되지 않습니다. 적은 수의 파일을 사용하면 인쇄 할 수없는 문자를 처리하는 편집기 (예 : vim)에서 첫 번째 파일을 열 수 있습니다. 그런 다음 파일 맨 아래로 이동하여 ": r second_file_name"을 입력하십시오. 인쇄되지 않는 문자를 포함하여 두 번째 파일을 가져옵니다. 추가 파일에 대해서도 마찬가지입니다. 모든 파일을 읽었 으면 ": w"를 입력하십시오. 결과적으로 첫 번째 파일은 원래 파일과 읽은 파일의 내용을 포함하게됩니다.