ファイル名からmm / dd / YYバックアップ日をエスケープします。

ファイル名からmm / dd / YYバックアップ日をエスケープします。

私は努力してきました:

cp file.csv file.$(date +%D).csv

ただし、ファイル名は別々のディレクトリを含むスラッシュであるため失敗しますfile.03/27/19.csv

私は再試行しました:

cp file.csv file.$(printf "%q" $(date +%D)).csv

しかし、それでも失敗します。

答え1

/ファイル名、ピリオドを含めることはできません(ASCIIベースのシステムではバイト0x2F)。

/U + 2215除算スラッシュ)または(U + 2044小数スラッシュ、現在のロケールで使用されている文字セットには少ない)などの文字を使用できるため、これを行うことができます(U + 2215文字がロケールに存在する場合)。 GBK、BIG5、UTF-8、GB18030を含むセット):

cp file.csv "file.$(date +%D | sed 's|/|∕|g').csv"

または、一部のシェルを使用してください(zsh少なくともbash)。

cp file.csv "file.$(date +%D | sed $'s|/|\u2215|g').csv"

(GNUを含むいくつかの実装はまだマルチバイト文字をサポートしていないため、ここではsed代わりに使用されています。)trtrtr

ただし、ファイルの作成時に使用されたものとは異なる文字セットを使用して、ロケールでファイル名が異なるようにレンダリングされるなどの問題が発生する可能性があります。 (もちろん、ユーザーはスラッシュが混乱しているように見えるのを見れば混乱します。)

私の提案はあいまいな標準形式を使用することです(たとえば、米国以外のほとんどの人にとって、2018年12月3日は2018年12月3日と解釈されます)YYYY-mm-dd形式(これはwrtソートにも役立ちますになります

cp file.csv "file.$(date +%Y-%m-%d).csv"

多くのdate実装により、次のように短縮できます。

cp file.csv "file.$(date +%F).csv"

関連情報