2

以下のスクリプトを実行し、特定のパターンの名前を持つファイルをソースから作業にコピーしようとしています。

#!/bin/bash
(set -o igncr) 2>/dev/null && set -o igncr; # this comment is required
SOURCE="D:/backup/"
WORKING="D:/copyFromHere/"
Copy_Pattern="P0689\|P1391\|P0730"

for FILE in $(find "$SOURCE" `ls -Rl "$SOURCE" | egrep '^d' | awk '{print $9}'` -print 
2>/dev/null | grep "$COPY_PATTERN" |sed 's/_[0-9]\+//' | uniq);

do
cp -f "FILE" "$WORKING";

done;

Windowsのcygwinで実行しています。

しかし、私はエラーを下回っています cp cannot stat file no such file or directory

これを理解するのを手伝ってください。

ありがとう、トム

4

3 に答える 3

0

少しお勧めできますか:

#!/bin/bash
set -xv
(set -o igncr) 2>/dev/null && set -o igncr; # this comment is required
SOURCE="D:/backup/"
WORKING="D:/copyFromHere/"
Copy_Pattern="P0689\|P1391\|P0730"

for FILE in $(find "$SOURCE" `ls -Rl "$SOURCE" | egrep '^d' | awk '{print $9}'` -print 2>/dev/null | grep "$COPY_PATTERN" |sed 's/_[0-9]\+//' | uniq);
do
    echo "cp -f \"FILE\" \"$WORKING\"";
done;
set +xv

set -xvシェル用のデバッガです。シェル スクリプトに記述されているとおりに実行中の行を出力し、すべての変数補間が行われた後にその行を出力します。これにより、プログラムが使用している各セットと、問題が発生している可能性のある場所を確認できます。set +xvデバッグをオフにするだけです。

cp -f "FILE" "$WORKING"ファイルFILEが実際には存在しないため、問題が発生していると思われます。また、ファイル名を拾っている(そしてそこでコピーが失敗している)と思われ、そこにファイルをコピーする前にディレクトリが実際に存在するかどうかを確認していない可能性があります。を使用するset -o xvと、これらのエラーの多くが非常に明確に表示されます。

cpステートメントに入れてechoおくと、実際に実行する前に、何を実行しようとしているのかを確認することもできます。これは、シェル スクリプトのデバッグを支援するもう 1 つの方法です。

また、あなたのforループがまさにあなたが望むことをしていないのではないかと思います。一度に 2 つのサブシェル コマンドを実行するという、非常に複雑なバッド ボーイです。(一度はバックティックを使用し、もう 1 つはバックティックを使用します。あらゆる種類の問題があるため$(..)、私は の使用に強く反対しています。まず、ループを開始する前に実行を終了する必要があります。並列操作はありません。次に、ファンキーなファイルがある場合第三に、非常に多くのファイルを返す可能性が非常に高いため、コマンド バッファがオーバーフローし、それが発生していることをユーザーに知らせることなく、静かにファイル名を削除する可能性があります。for var in $(find ...)findforforfind

 find ... | while read something

これにより、遭遇する多くの問題が解消さforれます。

于 2013-07-08T21:03:36.280 に答える