質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.33%

  • Linux

    4035questions

    Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

  • CentOS

    2831questions

    CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

  • bash

    694questions

    bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

  • シェル

    257questions

    シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

  • コピー

    24questions

    元のオブジェクトを破壊することなく、オブジェクトの複製を生成することをコピーと呼びます。

バックアップ時にファイル名に世代番号を付けたい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 889

babylone

score 3

環境
linux

前提・実現したいこと

linuxのCentOSにてシェルスクリプトでリリース作業をする前にファイルのバックアップを実施しており
バックアップファイルの末尾に作業日名を付けているが
同日にリリースする必要が出た場合、更にファイルの末尾に_数字を付けて世代管理をしたい

イメージ
test.txt.20170928
test.txt.20170928_1
test.txt.20170928_2
.
.
.

発生している問題

現状のコマンド
\cp -p /tmp/test.txt /tmp/backup/test.txt.date +%Y%m%d

試したこと

\cp -p --backup=t /tmp/test.txt /tmpbackup/test.txt.date +%Y%m%d
この場合

-rw-r--r-- 1 apache apache        0  9月 28 11:29 2017 test.txt.20170928
-rw-r--r-- 1 apache apache        0  9月 28 11:29 2017 test.txt.20170928.~1~

と[_]ではなく[~]になってしまいいしかも囲われてしまいます。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

~1~を手間を掛けて_1に付け直すメリットは無いと思いますが、何かあるのでしょうか?

for f in *.~*~
do
  body=${f%.~*~}
  suff=${f##*.~}
  num=${suff%~*}
  mv $f ${body}_${num}
done

追記

FILE=/tmp/test.txt
DEST=/tmp/backup

name=${FILE##*/}.`date +%Y%m%d`
filename=$name
n=0
while test -f $DEST/$filename
do
  let n++
  filename=${name}_$n
done
cp -p $FILE $DEST/$filename

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/29 14:51

    回答ありがとうございます!

    _世代番号に拘る理由はただの現場の慣習です。
    以前は手動でその都度世代番号を付けていたのですが処理をシェルスクリプトで自動化しようという話になった際に以前と同じ形式でできないかなと思い相談させて頂いたという経緯になります。

    提示いただいたプログラムをバックアップファイルと同階層のディレクトリで実行した所意図したとおり変更されてることが確認できました。ありがとうございます。

    因みに実行するシェルスクリプトをバックアップファイルと別のディレクトリに配備する必要が出た場合提示いただいたプログラムをどのように修正すればよいでしょうか?宜しければお教えください。

    例シェルスクリプトの配置ディレクトリ[/tmp]
    バックアップファイルの配置ディレクトリ[/tmp/backup]

    キャンセル

  • 2017/09/29 15:03

    すいません自己解決できました。ありがとうございます。

    キャンセル

  • 2017/09/29 15:25

    度々すいません。

    頂いたプログラムでファイルネームのリネームが出来ることは分かりましたが
    バックアップのプログラムとリネームのプログラムを同じシェルスクリプト内に書くことは可能でしょうか?

    上で私が試しているバックアップコマンドは同名ファイルがあった場合のみ世代番号を付加したファイルを作成していきます。

    一度バックアップコマンドを実施後、バックアップファイルがあるディレクトリへ移動した後
    頂いたプログラムを実施するシェルスクリプトを作成し実施してみましたが
    都度バックアップファイルがリネームされてしまう為、バックアップコマンド実施時に新たな世代番号のバックアップファイルが作成されなくなりました。

    宜しければ対応策をお教えください

    キャンセル

  • 2017/09/29 15:53

    なるほど。番号が連続しないと言う事ですね。そりゃそうか、うっかりしてました。
    となると、cp の --backup=t ではどうしようもないので、
    案1:あきらめてUnix標準のバックアップファイル名を使う事にする
    案2:最終番号を調べてコピー先ファイル名を付けるスクリプトを書く
    (案2のスクリプトは時間のあるときに書いて、回答に追記します)

    キャンセル

  • 2017/09/29 16:08

    お手間を取らせてすいません。お待ちしております。

    キャンセル

  • 2017/10/02 16:17

    追記ありがとうございました。

    頂いたプログラムを実行した所、下記エラーが出力されました。
    「cp: cannot create regular file `/tmp/backup/#{FILE##*/}.20171002': そのようなファイルやディレクトリはありません」
    なお発生していた問題につきましては頂いたアドバイスを元に自己解決することが出来ました。ありがとうございます。

    キャンセル

  • 2017/10/02 16:54 編集

    すいません。投稿時にちょっと手直しした際にタッチミスがあったようです。修正しました。

    キャンセル

  • 2017/10/02 17:28

    修正ありがとうございます!

    意図した通りに動くこと確認できました。
    自分の見難いプログラムより断然見やすいものを頂けたので此方を採用させて頂きます。
    ありがとうございました!

    キャンセル

0

!/bin/bash

リリースファイルのパス

ReleaseFILE=/tmp/test.txt

バックアップディレクトリ

BackDIR=/tmp/backup

最新バックアップファイルのファイルネームの取得

Filename=$(ls -lt $BackDIR | grep date +%Y%m%d | head -n 1 | awk '{print $10}')

最新バックアップファイルのファイルネーム"_"以降の世代番号の取得

Sedai=$(echo $Filename |awk '{print substr($0,index($0,"_"),length($0))}' | awk '{print substr($0,2,length($0))}')

新規バックアップファイルのファイルネームに付けるべき世代番号

Num=expr $Sedai + 1

当日日付のバックアップファイルが存在する時の分岐判定に使用

Hantei=$(echo $Filename | awk '{print index($0,"_")}')

if ! ls -l $BackDIR | grep date +%Y%m%d > /dev/null 2>&1

then

\cp $ReleaseFILE $BackDIR/test.txt.date +%Y%m%d
chown apache:apache $BackDIR/test.txt.date +%Y%m%d

elif test $Hantei -eq 0

then

\cp $ReleaseFILE $BackDIR/test.txt.date +%Y%m%d_1
chown apache:apache $BackDIR/test.txt.date +%Y%m%d_1

else

\cp $ReleaseFILE $BackDIR/test.txt.date +%Y%m%d_$Num
chown apache:apache $BackDIR/test.txt.date +%Y%m%d_$Num

fi

ls -l $BackDIR

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • Linux

    4035questions

    Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

  • CentOS

    2831questions

    CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

  • bash

    694questions

    bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

  • シェル

    257questions

    シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

  • コピー

    24questions

    元のオブジェクトを破壊することなく、オブジェクトの複製を生成することをコピーと呼びます。