파일 디렉터리가 있고 두 파일을 각 파일에 병합해야 합니다. 단순화를 위해 intro.txt
및 를 사용합니다 outro.txt
.
따라서 파일의 경우 다음 내용이 포함된 새 파일을 원합니다 file1.txt
.file3.txt
intro.txt
+file1.txt
+outro.txt
intro.txt
+file2.txt
+outro.txt
intro.txt
+file3.txt
+outro.txt
각기.
단일 파일의 경우 나는 할 것입니다
cat intro.txt file1.txt outro.txt > output.txt
많은 파일을 사용하여 이 작업을 가장 잘 수행하려면 어떻게 해야 합니까?
답변1
본문 파일을 반복하여 cat
머리글과 바닥글 파일을 각 본문 파일과 연결하고 새 이름으로 출력합니다.
for body in file*.txt; do
cat intro.txt "$body" outro.txt >"${body%.txt}-complete.txt"
done
file1-complete.txt
그러면 완성된 파일이 file2-complete.txt
. 출력 파일 이름은 .txt
이름에서 알려진 파일 이름 접미사를 제거 하고 끝에 $body
추가하여 구성됩니다.-complete.txt
기존 출력 파일을 덮어쓰게 됩니다.
답변2
나는 당신의 "고기" 파일의 이름이 (당신이 부르는 대로 file1.txt
) file3.txt
glob 표현에 의해 무시될 수 있다고 가정합니다 file*.txt
.
이 경우 다음이 작동합니다(여기서는 Bash 스타일의 문자열 조작이라고 가정하지만 다른 쉘에 적용하는 것은 간단해야 합니다).
for f in file*.txt; do
out="${f/%.txt/_complete.txt}";
cat intro.txt "$f" outro.txt > "$out";
done
이는 glob 표현식과 일치하는 모든 파일을 반복하고 접미사를 (그래서)로 대체하여 file*.txt
쉘 변수에 저장된 새 파일 이름을 생성합니다 . 그런 다음 현재 입력 파일의 시작과 끝을 새 파일에 넣습니다.$out
.txt
_complete.txt
file1.txt
file1_complete.txt
cat
답변3
그리고 zsh
:
for f (file<1-3>.txt) (cp =(cat intro.txt - outro.txt) $f) < $f
=(cat intro.txt - outro.txt)
이 명령의 출력이 포함된 임시 파일의 경로로 확장됩니다 cat
.
cat intro.txt $f outro.txt
읽기 위해 열 수 없는 경우 전체 하위 쉘을 취소하기 위해 대신 리디렉션을 사용합니다 . 파일의 속성(소유자, 그룹, 권한 등)을 유지하는 대신 사용합니다.(...)
$f
cp
mv
cp
실패하더라도 계속 실행됩니다 cat
.
다음을 수행할 수 있습니다.
for f (file<1-3>.txt) (){
cat cat intro.txt $f outro.txt > $1 &&
cp -- $1 $f
} =(:)
그것을 피하기 위해.
ksh93
이런 종류의 작업을 처리하는 전용 리디렉션 연산자가 있습니다.
for f in file[123].txt; do
cat intro.txt "$f" outro.txt >; "$f"
done
여기서 >;
명령이 성공하면 대상으로 이름이 바뀌는 임시 파일에 출력을 씁니다. 그러나 파일의 원래 속성 중 일부가 손실될 수 있습니다.
( [123]
이 3개 문자 중 하나와 일치하는 점에 [1-3]
유의하십시오 ([123²¹¼½١٢۱۲߁߂१२১২੧੨૧૨୧୨௧௨౧౨౹౺౼౽೧೨൧൨෧෨๑๒໑໒༡༢༪༫၁၂႑႒፩፪១២៱៲᠑᠒᥇᥈᧑᧒᧚᪁᪂᪑᪒᭑᭒᮱᮲᱁᱂᱑᱒₁₂⅐⅑⅒⅓⅔⅕⅖⅙⅛⅟①②⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳⑴⑵⑽⑾⑿⒀⒁⒂⒃⒄⒅⒆⒇⒈⒉⒑⒒⒓⒔⒕⒖⒗⒘⒙⒚⒛⓫⓬⓭⓮⓯⓰⓱⓲⓳⓴⓵⓶⓾❶❷❿➀➁➉➊➋➓〡〢㉈㉉㉑㉒㉓㉔㉕㉖㉗㉘㉙㋀㋁㋉㋊㋋㍙㍚㍢㍣㍤㍥㍦㍧㍨㍩㍪㍫㍬㍭㍮㍯㍰㏠㏡㏩㏪㏫㏬㏭㏮㏯㏰㏱㏲㏳㏴㏵㏶㏷㏸㏹㏺㏻㏼꘡꘢꣑꣒꤁꤂꧑꧒꧱꧲꩑꩒꯱꯲12
답변4
cat
여러 파일을 병합하기 위해 디렉터리에 파일 이름 배열 만들기
array=($(ls file* | xargs -n 1 basename))
for filename in "${array[@]}"
do
cat intro.txt $filename outro.txt > final_$filename
done