Test_*.txt
ファイルをにコピーする必要がありますTest_20190101_Timestamp.txt
。ここで、*
ワイルドカードは20190101
日付です。
cp test_*.txt test_*_"$(date +%Y%m%d-%H%M%S)".txt
ファイルをコピーすると、出力コピーも.で終わりますTest_*_Timestamp.txt
。ワイルドカードを使用せずにファイル全体をコピーするにはどうすればよいですか?
私もこれを試しましたが、やはり失敗しました。
cp test_*.txt test*_"$(date +%Y%m%d-%H%M%S)".txt
cp: target 'test*_20200102-160523.txt' is not a directory
答え1
ファイルを繰り返す必要があります。
for file in Test_*.txt; do
fileroot=${file%.txt} # remove the extension
cp -v "$file" "${fileroot}_Timestamp.txt"
done
答え2
問題は、あなたが見つけたように、最初の試みでワイルドカードの実際の値がコマンドの他のパラメータ間で(つまり、ソースファイル名から期待されるファイル名へ)「転送」されると仮定することです。
ただし、これはシェルでワイルドカード拡張(または「グローバル拡張」)が機能する方法ではありません。代わりに、ワイルドカードが表示されるたびに、シェルはそれを一致するファイルのリストに内部的に展開し、完全なリストを指定したようにコマンドを実行します(例:このチュートリアルシェルワイルドカード情報)。だからファイルがあれば
Test_a.txt
Test_b.txt
Test_c.txt
ディレクトリでは、cp
コマンドは実際に入力したように見えます。
cp Test_a.txt Test_b.txt Test_c.txt Test_*_20200102-160523.txt
最後のパラメータがコピーコマンドのターゲットとして使用され、複数のソースファイルを指定したため、cp
これがディレクトリであると仮定し、その名前のディレクトリが存在しないと文句を言います。
Test_*_20200102-160523.txt
なぜ今ディレクトリがないと文句を言うのですか?文字通りの意味 *
内部に?標準動作(最小bash
)はワイルドカードを指定し、一致するファイルがない場合、ワイルドカードは文字通りそのものとして解釈され、式はターゲットファイル名として意図されるため、Test_*_20200102-160523.txt
現在のディレクトリにまだ存在しません。
これが@glennjackmanの答えの後ろにある理由です。必要な結果を得るには、入力ファイルを繰り返す必要があります。