ワイルドカードを使用したファイルのコピーとタイムスタンプの追加

ワイルドカードを使用したファイルのコピーとタイムスタンプの追加

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の答えの後ろにある理由です。必要な結果を得るには、入力ファイルを繰り返す必要があります。

関連情報