ファイルからコピーコマンドを実行する

ファイルからコピーコマンドを実行する

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オプションは、次のスペースがエスケープ文字として解釈されるのを無効にするために含まれています\。ただし、ここでこれを行うにはシェルが必要です。

おすすめ記事