2016-12-19 2 views
1

findコマンドの後に続きます。find -inameはスクリプトでは機能しません。

find Work/Linux4/test/test/test_goal/spyglass_reports/clock-reset/Ac_coherency06/ -iname "Ac_coherency*.csv" 

は、シェルで実行するとうまく動作します。 しかし、perlスクリプトでは何も返しません。

#!/bin/bash 

REPORT_DIR=$1 
FIND_CMD=$2 

echo "@@"; 
echo $REPORT_DIR ; 
echo $FIND_CMD ; 

LIST_OF_CSV=$(find $REPORT_DIR $FIND_CMD) 
echo $LIST_OF_CSV 

if [ "X" == "X${LIST_OF_CSV}" ]; then 
    echo "No files Found for : '$FIND_CMD' in directory "; 
    echo " '$REPORT_DIR' " | sed -e 's;Work/.*/test_reports;Work/PLATFORM/test_reports;g'; 
    echo; 
    exit 0; 
fi 

スクリプトの出力:あなたはシェル上では​​なく、スクリプトでも実行されているコマンドを使用している場合

@@ 
Work/$PLATFORM_SPECIES/test_reports/clock-reset/Ac_coherency06 -iname "Ac_coherency06*.csv" 

No files Found for : '-iname "Ac_coherency06*.csv"' in directory  'Work/PLATFORM/test_reports/clock-reset/Ac_coherency06' 
+2

相対パスを使用していますが、適切な場所からスクリプトを実行していますか?また、 'set -x'を実行して、あなたのコマンドが本当に必要な方法で変数を展開しているかどうかを調べてください。変数にコードを格納することは、人々の期待通りに機能しないことがよくあります(http://mywiki.wooledge.org参照)。/BashFAQ/050) –

+0

あなたのスクリプトに、 './myscript 'Work/$ PLATFORM_SPECIES/test_reports/clock-reset/Ac_coherency06 --iname" Ac_coherency06 * .csv "のような一重引用符で囲まれた1つの引数を渡しているようです。 ''。これはうまくいきません:単語の分割後(うまくいけばあなたのグロブに一致するファイルがないことを願って)、 'find'は' Work/$ PLATFORM_SPECIES/test_reports/clock-reset/Ac_coherency06'、 '-iname'、 '' Ac_coherency06 * .csv "' quotes:与えられたディレクトリは存在しません。存在していても、引用符のために一致するファイルはありません。 –

+0

さて、実際には './myscript 'Work/$ PLATFORM_SPECIES/test_reports/clock-reset/Ac_coherenc y06' '--iname" Ac_coherency06 * .csv "''という2つの引数を渡している可能性があります。スクリプトとあなたが私たちに与える出力)...とにかくこれは間違っているプレーン。 –

答えて

0

、私がしようと最初にすることは、コマンドでバッシュを指定することですこれが動作するかどうか呼び出されて、次を参照してください。

bash -c 'find Work/Linux4/test/test/test_goal/spyglass_reports/clock-reset/Ac_coherency06/ -iname "Ac_coherency*.csv"' 

あるいはさらに良い:

/bin/bash -c 'find Work/Linux4/test/test/test_goal/spyglass_reports/clock-reset/Ac_coherency06/ -iname "Ac_coherency*.csv"' 

ます。また、必要に応じて、変数または他のデータ構造に結果を格納し、例えば、スクリプトに後でそれを渡すことができます。

ResultCommand="$(bash -c 'find Work/Linux4/test/test/test_goal/spyglass_reports/clock-reset/Ac_coherency06/ -iname "Ac_coherency*.csv"')" 

編集:この答えはより多くを編集した度も修正します可能な問題。

+0

私はこのサウンドアドバイスを一般的に呼ぶつもりはありません。特に二重引用符を使用すると、変数の逆参照を含むコードが実行されている他のシナリオでは、このようにカプセル化すると複雑さとバグの余地が増えます。外側のシェルで展開された引用符と内側のシェルで展開された引用符を正確に区別する必要があります。 –

+0

チャールズ、あなたのコメントをありがとう。私はOPが彼らのポストでそれらを使用するので、二重引用符でこれを作った。二重引用符を使用すると、スペースがあるファイル名(例: 'Ac_coherency tomorrow * .csv')を検索することができます。また、OPが' \ "$ something \ "。私はOPが二重引用符を使用したと思う。なぜなら彼はある時点でこれらの機能を使うつもりかもしれないからだ。二重引用符は複雑さを増すだけでなく、いくつかの機能を追加します。 –

+0

上記のコメントは実際に私の言いたいことを助けます: '" ... \ "$ foo \" ... "'の例では、バックスラッシュエスケープ引用符は、* inner *シェルの構文'bash -c'と一緒に); *外部*シェルの場合、 'bash -c'コマンドを実行しているものは意味がありません。外側のシェルが '$(rm -rf〜)'に展開した場合、内部シェルは再びそれを展開します。外側のシェルが展開されず、内側のシェルが '$ foo'展開されていれば、これは安全です。 –

0

あなたがfind述語のリストを渡すことができるようにしている場合は、スクリプトに引数ごとfindにリスト形式、1つの引数に保管してください。この方法で実装例として:ここで

#!/bin/bash 

# read report_dir off the command line, and shift it from arguments 
report_dir=$1; shift 

# generate a version of report_dir for human consumption 
re='Work/.*/test_reports' 
replacement='Work/PLATFORM/test_reports' 
if [[ $report_dir =~ $re ]]; then 
    report_dir_name=${report_dir//${BASH_REMATCH[0]}/$replacement} 
else 
    report_dir_name=$report_dir 
fi 

# read results from find -- stored NUL-delimited -- into an array 
# using NUL-delimited inputs ensure that even unusual filenames work correctly 
declare -a list_of_csv 
while IFS= read -r -d '' filename; do 
list_of_csv+=("$filename") 
done < <(find "$report_dir" '(' "[email protected]" ')' -print0) 

# Use the length of that array to determine whether we found contents 
echo "Found ${#list_of_csv[@]} files" >&2 

if ((${#list_of_csv[@]} == 0)); then 
    echo "No files found in $report_dir_name" >&2 
fi 

shiftはあなたのリストから、最初の引数を消費し、そして"[email protected]"は、その時点の後に残っている他のすべてを指します。 これは、別々の個々の引数としてfindに渡す必要のある項目が、個別の個別の引数としてスクリプトに渡すことができる必要があります。

したがって、使用yourscript "/path/to/report/dir" -name '*.txt'と、最初に、$1$2-nameなり、$3*.txtなり、/path/to/report/dirあろう。しかし、shiftが実行された後、$1-nameとなり、$2*.txtとなります。 "[email protected]"は、それぞれ別個の単語として渡された両方を指します。

ストリームのオフのアイテムを読み取る while readループの使用の詳細については
  • BashFAQ #001を参照してください。 bashのネイティブ文字列置換のために使用される構文の詳細については
  • BashFAQ #005を参照し、その内容を拡大し、その長さ又は"${arrayname[@]}"を確認する${#arrayname[@]}含む、シェル・アレイの詳細についてはBashFAQ #100又はhttp://wiki.bash-hackers.org/syntax/pe
  • 参照。
関連する問題