私のスクリプト入力に基づいてさまざまなファイルセットを見つけるには、Bash関数で "find"コマンドを使用する必要があります。
だから私は次のようなものを持っています:
DAYS=30
case $1 in
A1) ARGLINE="-name 'FOO*.xml' -or -name 'BAR*.xml' -or -name 'BTT*.txt'"
;;
A2) ARGLINE="-name 'PO*xml' -or -name 'PR*xml'"
;;
...
esac
find . -maxdepth 1 -type f -mtime +${DAYS} `${ARGLINE}`
これはうまくいきます。
しかし、次のように変数を使用して日数を検索したいと思います。
DAYS=30
case $1 in
A1) ARGLINE="-name 'FOO*.xml' -or -name 'BAR*.xml' -or -name 'BTT*.txt'"
;;
A2) ARGLINE="-name 'PO*xml' -or -name 'PR*xml'"
;;
...
esac
if [[ $# -gt 1 ]]; then
DAYS=$2
fi
find . -maxdepth 1 -type f -mtime +${DAYS} `${ARGLINE}`
この機能が失敗した場合探す一致するファイルが見つかりませんでした。次のエラーが発生しました。
'-name'コマンドが見つかりません。 'coreutils' (デフォルト) パッケージの 'uname' コマンドを意味します。 -name: コマンドが見つかりません。
ただし、findが一部のファイルを見つけるのにかかる日数がこの値に達すると、正常に機能します。成功した実行の出力を別のコマンドにパイプしようとすると失敗します。
「検索」の引数行をどのように適切に設定する必要がありますか?
ベストアンサー1
ではbash
配列を使用します。
args=( '(' -name 'FOO*.xml' -or -name 'BAR*.xml' -or -name 'BTT*.txt' ')' )
)を使用するので、正しいブール論理グループを作成するために追加の括弧が使用されます-or
。
find
次に、コマンドで次の操作を行います。
find ...some arguments... "${args[@]}"
使用するため、追加の問題があります。
`$ARGLINE`
$( $ARGLINE )
これは、シェルが$ARGLINE
(対応する値)をコマンドとして実行しようとするのと同様のコマンドの置き換えです。これが「コマンド '-name'が見つかりません」というメッセージが表示される理由です。コマンドの置き換えは失敗しますが、find
実行されるので「動作する」と思います。