ファイルディレクトリがあり、両方のファイルを各ファイルにマージする必要があります。単純化のために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