앞에 추가된 파일을 사용하여 디렉터리의 여러 파일을 연결합니다.

앞에 추가된 파일을 사용하여 디렉터리의 여러 파일을 연결합니다.

파일 디렉터리가 있고 두 파일을 각 파일에 병합해야 합니다. 단순화를 위해 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.txtglob 표현에 의해 무시될 수 있다고 가정합니다 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.txtfile1.txtfile1_complete.txtcat

답변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읽기 위해 열 수 없는 경우 전체 하위 쉘을 취소하기 위해 대신 리디렉션을 사용합니다 . 파일의 속성(소유자, 그룹, 권한 등)을 유지하는 대신 사용합니다.(...)$fcpmv

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

관련 정보