データファイルをクリーンアップするスクリプトがあります。
注文する:
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-
、これも重複します。find
1回の呼び出しに任意のロジックを配置できます。
find /ddomain/data/shop12/ -name '*data-*' -mtime +15 -print
また、-print
基本的な操作であるdeleteを実行します。
find /ddomain/data/shop12/ -name '*data-*' -mtime +15
ファイルのみを探している場合は、-type f
以下も追加してください。
find /ddomain/data/shop12/ -type f -name '*data-*' -mtime +15
答え2
他の人がすでに述べたように、単一のgrep -v '^.$'
文字で構成される行をフィルタリングします(行の先頭(^
)、文字(.
)、行の終わり()で構成される行)。これを作成するもう1つの方法は、where、作成、および暗黙的(一致)$
です。フルライン)。grep -vx .
-x
^
$
.
出力情報:
find /ddomain/data/shop12/ -mtime +15 -print
このコマンドの出力はfind
通常次の行で構成されるため、これは意味がありません。
/ddomain/data/shop12/foo
/ddomain/data/shop12/foo/bar
...
この出力に単一の文字を含む行が含まれる唯一の方法は、同様の名前がある場合です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