データファイルをクリーンアップするためのスクリプトがあります
コマンド:
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 1
find
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