3

シェル スクリプトで find を使用して、ワイルドカード パターンに一致するファイルの数をカウントし、1 つしかない場合はファイルの名前を取得しようとしています。しかし、ワイルドカード パターンをバックティック展開に渡すのに問題があります。

FINDCMD="find . -iname *DATA*.txt"
DATACOUNT=$($FINDCMD | wc -l)

if [ $DATACOUNT -eq 1 ]
then
  use-data $($FINDCMD)
else
  echo bugger
fi

これは機能しません。シェルは、find の呼び出し時にDATA .txt を展開します。アスタリスクを渡して検索したい。

私がそれを作るなら

FINDCMD="find . -iname '*DATA*.txt'"

次に、シェルはアスタリスクを展開しませんが、find は単一引用符を取得し、何も一致しません。

4

3 に答える 3

1

次の両方を実行します。

  1. 検索コマンドで引用符を使用:FINDCMD="find . -iname \"*DATA*.txt\""またはFINDCMD='find . -iname "*DATA*.txt"'
  2. 次の bash オプションを使用します:スクリプトの冒頭で-f Disable pathname expansion.次のようにset -f

これでうまくいくはずです。ただし、スクリプトではテストされていませんが、この時点からアイデアを得る必要があります。

于 2011-08-01T08:30:00.950 に答える
1

コマンドを変数に入れないでください。コマンドを直接実行するだけで何が問題になっていますか?

DATACOUNT=$(find . -iname "*DATA*.txt" | wc -l)
if [ $DATACOUNT -eq 1 ];then
    .....
fi

編集:

コマンドを再利用したい場合は、サブルーチンを使用してください

myfind(){
    find . -iname "*DATA*.txt" | wc -l
}
于 2011-04-01T08:32:52.143 に答える
-1

一重引用符と二重引用符を切り替えます。

試す:

FINDCMD='find . -iname "*DATA*.txt"'
于 2011-04-04T08:40:53.590 に答える