findコマンドに引数を渡そうとしたときに問題が発生しますか?

findコマンドに引数を渡そうとしたときに問題が発生しますか?

範囲:

export exc_lst='! -path  "/var/app/s2/pnl/incoming/recondata/*.*"';

次の find コマンドを使用しようとすると:

find $FILE_DIR -name "*.*"  "${exc_lst}" -type f -mtime +20 -user sh79790 -ls

エラーが発生します。接続不足

find $FILE_DIR -name "*.*"  ${exc_lst} -type f -mtime +20 -user sh79790 -ls

記載されているパスは除外されません。

値を直接渡すと正常に動作します。

find $FILE_DIR -name "*.*" ! -path  "/var/app/s2/pnl/incoming/recondata/*.*" -type f -mtime +20 -user sh79790 -ls

findコマンドから除外するすべてのファイルを含む変数を解析する必要があります。

答え1

引用の問題があります。

ヒント:コマンドラインの前に貼り付けて、echo実際に拡張される内容を確認してください。具体的には、各引数が区切られた位置を正確に表示するには、python -c "import sys; print sys.argv[1:]"コマンドラインの前に貼り付けます。

python -c "import sys; print sys.argv[1:]" \
    find $FILE_DIR -name "*.*"  "${exc_lst}" -type f -mtime +20 -user sh79790 -ls

出力:

['find', '-name', '*.*', '! -path  "/var/app/s2/pnl/incoming/recondata/*.*"', '-type', 'f', '-mtime', '+20', '-user', 'sh79790', '-ls']

ご覧のとおり、! -path "/var/app/s2/pnl/incoming/recondata/*.*"スペースと引用符を含む1つの大きなパラメータとして提供されています。引用に必要な事項は次のとおりです${exc_lst}"。拡張しないでください。findこれを認識しないでください。!-pathおよびpathはどちらも別々のパラメータとして使用されます。

今:

echo find $FILE_DIR -name "*.*"  ${exc_lst} -type f -mtime +20 -user sh79790 -ls

出力:

find -name *.* ! -path "/var/app/s2/pnl/incoming/recondata/*.*" -type f -mtime +20 -user sh79790 -ls

ご覧のとおり、パス名の周囲には文字通り二重引用符文字があります。実際、これらの引用符を含むパスは除外されますが、これは発生しません。

exc_lst次の引用なしで定義してみてください。

export exc_lst='! -path  /var/app/s2/pnl/incoming/recondata/*.*'

次に、2番目の形式を使用します。

find $FILE_DIR -name "*.*"  ${exc_lst} -type f -mtime +20 -user sh79790 -ls

幸い、除外するパスにはスペースは含まれていません。それならこれを達成するのは難しいでしょう。

注:私のすべての出力例には、最初のパラメータが私のシェルfindで定義されていないため$FILE_DIR(対応する値を指定しなかった)、欠落していますが、定義されている場合はそのパラメータがあります。

答え2

exec_lst実行方法を定義すると同時に、シェルがファイル名を拡張するのを防ぐことはできません。

-pathこれらのパラメーターは別々のパラメーターになければなりません。

したがって、コマンドラインから直接 `-path * を使用し、パスをシェル変数に入れることをお勧めします。

別のアプローチは、$ [exed_lst]の周りの "を省略し、変数割り当ての各アスタリスクの前に1〜2個のバックスラッシュを追加することです。

関連情報