次のbashスクリプトがあります。
for i in **/*.h; do head $i -n -2 > $i.tmp && mv $i.tmp $i -f; done
目的は、現在のディレクトリ内のすべての .h ファイルを実行し、そのファイルから最後の 2 行を削除することです。
ただし、これは現在のディレクトリのサブフォルダーに直接配置されているファイルに対してのみ意図したとおりに機能しますが、サブフォルダーのサブフォルダー内のファイルなどは処理しないため、./foo/foobar.h は処理されますが、./foo /bar/foobar.h または for/bar/foobar/.foobar.h はそうではありません。
したがって、私はこの方法で試しました:
for i in 'find -name *.h'; do head $i -n -2 > $i.tmp && mv $i.tmp $i -f; done
> $i.tmp があいまいであるため、これは失敗します
ディレクトリ内のすべてのヘッダー ファイルを処理するには、スクリプトがどのように表示される必要がありますか? サブフォルダー内でヘッダー ファイルがどれほど深くネストされていてもかまいません。
編集:元のファイルに eof の直前に改行がない場合、上記の最初のスクリプト (および回答の sed 代替) が改行を追加するため、eof の前の改行が望ましくない場合は、後で削除されます:
for i in **/*.h; do head $i -n -2 > $i.tmp && mv $i.tmp $i -f && truncate --size=-2 $i; done
サイズは、CRLF (Windows スタイル) 改行の場合は -2、CR (古い MacOS スタイル) と LF (UNIX スタイル) の両方の行末の場合は -1 にする必要があります。
もちろん、このアプローチは eof の前にある改行も削除します。