0

現在のディレクトリとすべてのサブディレクトリに移動し、.sql で終わる各ファイルにいくつかの注釈を追加しようとしています

コードのスニペットをここに示します

HEADER="--SQL HEADER"

for f in 'find . -name *.sql';
do
        echo $f
        echo -e $HEADER > $f.tmp;
        FNAME=${f//\//_/};
        echo -e "\n\n--MORE ANNOTATIONS ${FNAME%.*}:1" >> $f.tmp;
        cat $f >> $f.tmp;
        mv $f.tmp $f;
        rm $f.tmp
done;

私はbashの初心者なので、ループを使用したfindステートメントが原因でエラーが発生する可能性があると思いますが、これは私が発生するエラーです

find . -name X.sql A.sql W.sql E.sql S.sql
./annotate.sh: line 6: $f.tmp: ambiguous redirect
./annotate.sh: line 8: $f.tmp: ambiguous redirect
./annotate.sh: line 9: $f.tmp: ambiguous redirect
mv: invalid option -- n
Try `mv --help' for more information.
rm: invalid option -- n
Try `rm --help' for more information.

どんな助けでも大歓迎です=)

4

2 に答える 2

3

これが問題です。あなたの「エコー」はそれを与えます:

echo $f

出力

find . -name X.sql A.sql W.sql E.sql S.sql

問題は、検索コマンドに逆引用符 (``) ではなく、まっすぐな一重引用符 ('') があることだと思います。したがって、実際には find を実行しているのではなく、単にワイルドカードを展開しています。

シェルによって評価される代わりに find に渡されるように、ワイルドカードを引用符で囲む必要がある場合があります。

for f in `find . -name \*.sql`;

ただし、スクリプトにはいくつかの問題があり、複数回使用する場合は対処する必要があります。ormaaj の回答を参照してください。

于 2012-04-19T19:22:40.730 に答える
2

すでに指摘したように、問題は find が実際には実行されていないことです。しかし、このパターンは非常に間違っています。出力を単語に分割するには単語分割が必要であり、引用符を必要としないため、 for ループを使用してコマンド置換を繰り返しても機能しません。

できれば、 を使用して-execください。最初にこのスクリプトをファイルに書き込み、次のようにしますchmod u+x scriptname

#!/usr/bin/env bash
header="--SQL HEADER"

for f in "$@"; do
    echo "$f" >&2
    fname=${f//\//_/}

    cat - "$f" <<EOF >"$f.tmp"
    ${header}$'\n\n'
    --MORE ANNOTATIONS ${fname%.*}:1
    EOF

    mv "$f.tmp" "$f"
done

次にfind、次のように実行します。

find . -name '*.sql' -exec scriptname {} +

または、(これが Bash の最近のバージョンであると仮定して)、globstarおよび noを使用しますfind(必要に応じて、ksh にも同様の機能があります)。これは、ジョブによっては遅くなる場合があります。シェルは、ファイルのリストを事前に生成する必要があります。

#!/usr/bin/env bash
shopt -s globstar

for f in ./**/*.sql; do
    ...

または、Bash 4 と必要な GNU ユーティリティを備えたシステムがある場合は、-print0.

find . -name '*.sql' -print0 | while IFS= read -rd '' f; do
    # <body of the above for loop here>
done

参照: http://mywiki.wooledge.org/UsingFind

于 2012-04-19T21:37:56.617 に答える