DE_CopyOldToNew.txt
古いファイル名を新しいファイル名にコピーするための複数のコピーコマンドを含むファイルがあります。
ファイルには次の行が含まれています。
cp /migrationfiles/Company\ Name\ GmbH/2014.138_Old\ File\ Name.pdf /appl/data/docs/202403/DE_2014.138_NewFile_1.pdf
cp /migrationfiles/Company\ Name\ GmbH/2014.139_Old\ File\ Name.pdf /appl/data/docs/202403/DE_2014.139_NewFile_1.pdf
私のシェルスクリプトでは、各行を繰り返し実行します。
echo "Start!"
while read -r line
do
command "$line"
done < /tmp/DE_CopyOldToNew.txt
スクリプトの実行時に読み取った各行について、次のようになります。
: No such file or directory6: cp /migrationfiles/Company\ Name\ GmbH/2014.138_Old\ File\ Name.pdf /appl/data/docs/202403/DE_2014.138_NewFile_1.pdf
プロンプトで手動で行を実行すると、エラーなしでうまく機能します。
ベストアンサー1
問題は、行全体を次のように読み取ることです。一つシェル変数をline
選択してから引用符を使用します(例:as "$line"
)。
シェル変数を扱うとき、特にスペースやその他の「問題のある」文字を含むファイル名を処理する場合、二重引用符は通常正確ですが、この場合は次のことを意味します。ワイヤーcp
命令で構成そしてその主張ステートメントは単一のシェルトークンとして扱われますcommand
。
これは、ループでcp
引数/migrationfiles/Company\ Name\ GmbH/2014.138_Old\ File\ Name.pdf
のあるコマンドを実行せず、/appl/data/docs/202403/DE_2014.138_NewFile_1.pdf
シェルが次の実行可能ファイルを実行しようとしていることを意味します。
cp /migrationfiles/Company\ Name\ GmbH/2014.138_Old\ File\ Name.pdf /appl/data/docs/202403/DE_2014.138_NewFile_1.pdf
コマンドと引数を区別するために使用されるスペースは、コマンド名の一部として解釈されます。もちろん、この実行可能ファイルは存在しません。
あなたができることは、この行を次の3つの変数として読むことです。
echo "Start!"
while read cmd arg1 arg2
do
command "$cmd" "$arg1" "$arg2"
done < /tmp/DE_CopyOldToNew.txt
構造は常に例に示されている形式を取ると仮定します。
ノートこのread
コマンド確かにこの-r
オプションは、次のスペースがエスケープ文字として解釈されるのを無効にするために含まれています\
。ただし、ここでこれを行うにはシェルが必要です。