範囲:
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個のバックスラッシュを追加することです。