タイムスタンプが追加されたファイルまたはディレクトリをファイル名/ディレクトリ名にコピーするスクリプトを作成しようとしています
何かのようなもの:
cover.jpg --> cover_18-01-2014_17:37:32.jpg
directory --> directory_18-01-2014_17:37:32
タイムスタンプをfilename/dirnameに追加する方法がわかりません。誰か助けてもらえますか?
タイムスタンプ
now="$(date +'%d-%m-%Y_%T')"
その後、自分でスクリプトを書くことができました
#timestamp
now="$(date +'%d-%m-%Y_%T')"
filename=$(basename "$1")
cp -r "$1" "$2"
if [ -f "$1" ]; then
extension="${filename##*.}"
name="${filename%.*}"
mv -f "$2/$filename" "$2/${name}_${now}.$extension"
else
mv -f "$2/$filename" "$2/${filename}_${now}"
fi
正規表現が\|
演算子をサポートするpax
実装の場合:
now=$(date +%F_%T)
pax -rw -"s@/\(\([^/]*\)\(\.[^/]*\)\|\([^/.]*\)\)@/\2\4_$now\3@g" . /dest/
代わりに2014-01-18形式を使用することを強くお勧めします。これは明確であり、辞書式順序と時系列で同じように並べ替えられるためです。
pax
がなく、GNU tar
がある場合は、代わりに次のように記述できます。
tar -cf - --transform="s@/\(\([^/]*\)\(\.[^/]*\)\|\([^/.]*\)\)@/\2\4_$now\3@g" . |
(cd /dest && tar xf -)
どちらの場合も、そこにシンボリックリンクがある場合、置換はシンボリックリンクのターゲットにも適用され、すべてのリンクターゲットが./some/thing
の形式でない限り、適切に実行される可能性は低くなります。
デバッグしようとしているスクリプトを追加すると役に立ちますが、これが私が行うことです。スラッシュの後に続くパスを含めて、スクリプトに2つの引数を指定する必要があります(簡潔にするために検証を入力しません)。
$ datestamp-cp.sh/path/to/source// path/to/destination /
日付スタンプの内容-cp.sh
#/ bin/env sh SRC = $ 1 DST = $ 2 NOW = $(date + '%d-%m-%Y_%T' ) for F in `ls $ SRC`; do EXT = `rev $ F | cut-d。 -f1` NAM = $ {F ## *。} cp -r $ SRC $ F $ DST $ NAM- $ NOW。$ EXT 完了
各ファイルに移動された正確な時刻(タイムスタンプと一致)を持たせたい場合は、NOW =行をFORループ内に移動します。
スクリプトを実行可能にすることを忘れないでください
chmod u + xdatestamp-cp.sh