1

次の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 の前にある改行も削除します。

4

2 に答える 2

1

最初のスニペットは、があり、

shopt -s globstar

有効にします。

グロブスター

設定されている場合、ファイル名展開コンテキストで使用されるパターン '**' は、すべてのファイルと 0 個以上のディレクトリおよびサブディレクトリに一致します。パターンの後に「/」が続く場合、ディレクトリとサブディレクトリのみが一致します。

http://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.htmlを参照してください。

于 2013-04-04T18:22:15.373 に答える