前に追加したファイルを使用して、ディレクトリ内の複数のファイルをリンクします。

前に追加したファイルを使用して、ディレクトリ内の複数のファイルをリンクします。

ファイルディレクトリがあり、両方のファイルを各ファイルにマージする必要があります。単純化のためにintro.txtとを使用してくださいoutro.txt

したがって、ファイルの場合は、次の内容を含む新しいファイルが必要ですfile1.txtfile3.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.txtfile3.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

関連情報