「grep -v "^.$"」は何をするのか

「grep -v "^.$"」は何をするのか

データファイルをクリーンアップするためのスクリプトがあります

コマンド:

for i in `find /ddomain/data/shop12/ -mtime +15 -print|grep -v "^.$" |grep data-`

関数なしでコマンドを実行してみましたgrep -vが、違いは見られません。

が何をするのか知りたいですgrep -v "^.$"。このスクリプトは私が作成したものではなく、オンラインでも何も見つかりません。

答え1

grep -v "^.$"1 文字のみの行を除く入力行をすべて出力します。

次のように使用されます。

find /ddomain/data/shop12/ -mtime +15 -print|grep -v "^.$"

これは、 の出力 (相対パスが使用されている場合に表示される).から現在の作業ディレクトリ ( )を破棄するためのものであると想定できます。これは オプションによって簡単に実現できますが、ここでは で絶対パスを使用しているため冗長です。find.-mindepth 1find

data-後で、によって名前に が含まれるファイルのみを検索しますgrep data-が、これも冗長です。すべてのロジックを 1 回のfind呼び出しにまとめることができます。

find /ddomain/data/shop12/ -name '*data-*' -mtime +15 -print

ドロップ-printもデフォルトのアクションです。

find /ddomain/data/shop12/ -name '*data-*' -mtime +15

なお、ファイルのみを探している場合は、-type f以下も追加してください:

find /ddomain/data/shop12/ -type f -name '*data-*' -mtime +15

答え2

他の人がすでに述べているように、grep -v '^.$'は、正確に 1 つの文字で構成される行 (行の先頭 ( ^) に続いて 1 つの文字 ( .) が続き、行の末尾 ( ) が続く行$) をフィルター処理します。別の書き方は、grep -vx .がおよび を暗黙的に-x作成する(行全体で一致する) というものです。^$.

出力について:

find /ddomain/data/shop12/ -mtime +15 -print

このコマンドの出力はfind通常次のような行で構成されるため、これはあまり意味がありません。

/ddomain/data/shop12/foo
/ddomain/data/shop12/foo/bar
...

その出力に 1 文字の行が含まれる唯一の方法は、 のような名前のファイルがある場合ですfoo<newline>X<newline>。それは完全に可能ですが、そのコマンドの意図ではなかったと思います。

おそらく、そのコマンドは (誤って) 以下から改変されたものです:

find . -mtime +15 -print | grep -v '^.$' | grep data-

これはエントリgrepをフィルタリングすることを意図したものです.(それでも、grep -Fvx .より適切だったでしょう)。ただし、次のように記述する方が理にかなっています。

find . ! -name . -path '*data-*' -mtime +15

で最上位ディレクトリをフィルタリングしたい場合はfind /ddomain/data/shop12/、次のようにします。

find /ddomain/data/shop12/. ! -name . -path '*data-*' -mtime +15

findまたは、実装が述語をサポートしている場合-mindepth:

find /ddomain/data/shop12/ -mindepth 1 -path '*data-*' -mtime +15

答え3

.結果リストからディレクトリを削除しますfind。例を挙げて説明すると簡単です:

find . -print
.
./prova2
./prova2/prova2  

find . -print | grep -v '^.$'
./prova2
./prova2/prova2  

ご覧のとおり、最初のコード スニペットでは.結果を見つけます。したがって、それをサイクルによって実行されるアクションに渡しますfor。2
番目のスニペットでは、.ディレクトリを の結果からスキップすることにしてfind、サイクルに送信しないようにしますfor

答え4

grep -v '^.$'1 文字のみの行を除外します。

例:

echo "foo
> bar
> x" | grep -v '^.$'
foo
bar

関連情報