少しお勧めできますか:
#!/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 ...)
find
for
for
find
find ... | while read something
これにより、遭遇する多くの問題が解消さfor
れます。