0

いくつかのファイルを生成する他のスクリプトを呼び出すシェル スクリプトがあります。シェル スクリプトの最後で、生成されたすべてのファイル (プレフィックスが同じ) をフォルダーに移動したいと考えています。

ただし、何らかの理由でmv、スクリプトの最後に呼び出しがあると、ファイルシステムがまだファイルについて認識していないように、このエラーが発生します。

mv: cannot stat `foo_*': No such file or directory

これを「解決」する最初の試みは、sleepこの問題を回避するために数秒の呼び出しを導入することでしたが、値が非常に高く、ファイルが既に作成されていると確信していたにもかかわらず、同じエラーが発生しました。

次に、次のようにスクリプトを実行してみました。

sh myscript.sh ; mv foo_* bar

そして問題なく動作しました。

これが発生する理由と、目的の効果を得るために 2 つのスクリプトまたは 2 行のコマンドを使用する必要を回避する方法を教えてください。

ありがとう。

編集:私は、Googleからここに来て、同様の問題を抱えている可能性のある人のためにこれを書いています.

基本的に、次のmvようなコマンドを生成していました。

mv $preffix"_*" $destination

何らかの理由で、それが正しく機能していませんでした。次のような一時変数を作成しました。

MV_CMD=$preffix"_*" $destination

そして、次のように呼び出しました:

mv $MV_CMD.

誰かがよりクリーンな方法を知っている場合は、お気軽に答えてください。回答ありがとうございます。

4

2 に答える 2

1

デバッグの目的で、スクリプトの最後に追加する代わりに、次を追加しますsleepmv

pwd
ls -la .

これにより、現在のディレクトリとそのすべての内容がコンソールに出力されます。

さらに、デバッグを有効にしてスクリプトを実行sh -x ./myscript.shします。実行されたすべてのコマンドを表示して、原因、作成されているファイル、および作成されているディレクトリをよりよく理解できます。

于 2013-03-27T23:59:20.497 に答える
0

プログラムが作成するゴミを残さないのが一般的な方法です

他のシェルで rm コマンドを確認してください.......作成された中間ファイルを削除または削除するように指示されている場合があります。

特定のディレクトリの変更も確認する必要があります。ファイルは他の場所に作成されているか、どこかに移動されている可能性があります。

ただし、どちらの場合も、スクリプトをブラウズして rm 、 mv 、または cd コマンドを探すだけで済みます。

それはそれをするべきです。

于 2013-03-28T01:52:37.950 に答える