if文でfindコマンドの結果をどのように使用し、それをtrueまたはfalseと比較できますか?
このような:
if [ `find . -name test.txt -size 156c`="true" ]; then echo Found; fi
完全なスクリプトは次のとおりです。
#!/bin/bash
if [ $# -ne 2 ]
then
echo Not enough params
fi
if [ `find . -name $1 -size $2c | grep -q .` -eq 0 ]
then
echo OK
fi
答え1
find
たぶん、単に出力をパイプに接続するだけでgrep
トリックを実行できます。
if find . -name test.txt -size 156c | grep -q .; then echo Found; fi
find
設定した名前とサイズの基準に一致するファイルが見つからない限り、呼び出しには出力がなく、grep .
入力が空でない場合にのみ終了ステータスは0(「true」)になります。このオプションを-q
使用するには、出力を印刷しないでください。ここでは終了状態のみを考慮するので、ここでは重要ではありません。
混乱の別の原因を取り除くには:@derobertがコメントで述べたように、括弧は構成構文の一部ではありません。ブール式を評価する役割を担うコマンドが次の形式でif
あることがわかります。[
終了コードの実際の値を返します([
シェル組み込みの場合もあります)。このコマンドは、閉じ括弧があることを確認します。
$ [ 3 -gt 2 ] ; echo $?
0
$ [ 3 -lt 2 ] ; echo $?
1
$ [ 3 -lt 2 ; echo $?
bash: [: missing `]'
2
上記のコマンドでは、0は真、1は偽、2はエラーを意味します。
答え2
私がコメントで述べたように、あなたの質問は実際に
テストを
find
満たしていることを確認するためにコマンドを使用して単一のファイルをテストするにはどうすればよいですか?find
size
ここで、ファイル名はスクリプトの引数として指定されます(したがって事前に不明)。コマンドを中心に回答を書いています。
if find . -name "$1" -size "$2"c | grep -q .
then
echo OK
fi
私はdhagが推薦した引用符を自由に挿入しました。これは悪い始まりではありませんが、いくつかの問題があります。
- ユーザーが引数を使用してスクリプトを実行し、次
test.txt
のスクリプトがある場合test.txt
現在のディレクトリのサブディレクトリfind
そして、それを見つけてパス名を印刷するとgrep
成功します。ただし、スクリプトがtest.txt
現在ディレクトリに呼び出されたファイルを使用して操作しようとすると、そのファイルが存在しないため失敗します。サブディレクトリが見つからないように
追加すると、この問題を解決できます。-maxdepth 1
find
- ユーザーが引数を使用してスクリプトを実行すると、引数
my_subdir/test.txt
にスラッシュが含まれない可能性があるためfind
失敗します-name
。 - 非常にいたずらなユーザーがいる場合、そのユーザーは
"*"
単に問題を引き起こすために入力している可能性があります。
find .
実際にディレクトリツリーを検索したくないときに使用するのは少し愚かなようです。ファイル名がわかっている場合は、そのプロパティをテストできます。まあ、あなたが片目を閉じてこの本の行の間を読んでいるならばfind(1)
、それは実際には決して言わないことに気づくでしょう。道引数はディレクトリでなければなりません。これは単なるディレクトリであることを意味するだけです。言えることが分かりました
探す ファイル名 [表現する]
問題に適用すると、次のようになります。
find "$1" -size "$2"c
完全な状態を確認するために、以下を提案します。
if [ -f "$1" ] && find "$1" -size "$2"c | grep -q .
then
echo OK
fi
指定されたファイルがまったく存在しない場合にエラーメッセージを受け取るのを防ぐためにfind
(そして上記のいたずらなユーザーがスクリプトにディレクトリ名を提供するのを防ぐため)
答え3
他の場所で提供されているソリューションと似ていますgrep
が、より簡単な場合があります。単にread
終了するだけですfind
。find
(read
確かにそうだから)最初のゲームでは、確実な戻り値を提供します。
find . -name test.txt -size 156c |
read -r na && echo ok || ! echo shite
...うまくいくでしょう。何でも印刷するとfind
末尾の改行があるので、read
単一の一致でもtrueを返しますfind
。ただし、find
何も印刷しないと、改行read
を読む前に到着するため、エラーが返されます。EOF
\n