.bak _before_ファイル拡張子を持つバックアップファイル

.bak _before_ファイル拡張子を持つバックアップファイル

私は通常、次のようにバージョン管理なしでサーバーの構成ファイルをバックアップします。

# cp httpd.conf{,.bak}
# ls
httpd.conf    httpd.conf.bak

ただし、Webルートにあるファイルの場合は、.bakファイル拡張子を慎重に追加して.php保存し、ApacheがまだPHPインタプリタを介してファイルを送信できるようにします(誰かがそのようなファイルが存在するかどうかを推測または調査する場合)。サーバー):

$ cp index.php index.bak.php
$ ls
index.php    index.bak.php

.bakファイル拡張子の前にタブ補完機能とマッスルメモリを挿入する方法はありますか?Tab{}←,.bak私は、ネットワークルートにあるファイルに対してこのクールな「ミットマクロ」を使用できないことを筋肉記憶で学びました。

ありがとうございます。

答え1

簡単かもしれません

cp file.{ext,bak.ext}

bash {}拡張子はすべての組み合わせに拡張されます(既存のファイルをリストする[]拡張子とは異なり)。したがって、2つのファイル名を生成します。

{ .... , .... } には、 file.ext と file.bak.ext をインポートするための 2 つのオプションがあります。

スクリプトで次を使用します。

cp $FILE.{$EXTENTION,bak.$EXTENTION}

FILENAMEを半分に分割するには、次のものを使用できます。

FILE=${FILENAME%.*}
EXTN=${FILENAME##*.}

${VAR%xxxxx} は、パターンが一致するまで VAR からコンテンツの左側を返します。上記の場合、パターンは.*なので、最後の.*を除くすべての項目が得られます。

${VAR##xxxxx} は、一致するパターンの後に VAR のコンテンツの右側を返します。二重ハッシュは、可能な一致が複数ある場合、可能な最大一致を得ることを意味する。

スクリプトを保存するには、FILE、EXTENTIONをインポートした後に他の状況があることを確認してください。ファイル名に拡張子がない場合、これが発生します。

スクリプトのサブセクションは次のとおりです。

ls *html | while read FILENAME
do
    FILE=${FILENAME%.*}
    EXTN=${FILENAME##$FILE}
    cp $FILE{$EXTN,.bak$EXTN}
done

答え2

いつでも関数を使用できます。

backup()
  for i do
    case ${i##*/} in
      (?*.?*) cp -iv -- "$i" "${i%.*}.bak.${i##*.}";;
      (*) cp -iv -- "$i" "$i.bak"
    esac
  done

${i##*/}はい、デフォルト名(つまり、右端のすべての項目が$i削除されます)は 。$i/bar/filefoo.bar/file

$i次に、拡張子が含まれていることを確認してください。つまりdot、両側に文字がある1つ以上の文字が含まれていることを確認します(?*はいすべての文字続いて0文字以上、そうですね1つ以上の文字)。たとえば、これを実行できないか、*.*バックアップがある可能性があります。~/.bashrc~/.bak.bashrc

上記の構文はPOSIXです-v言葉が多い)オプションcpはGNU拡張であり、BSDなどの他の実装でも見つけることができます。

その後、次のようにできます。

backup foo.php bar.html baz<Tab>...

または:

backup *.php

-iデータが失われるか(ファイルを上書きする前に確認メッセージが表示されます。GNU-bオプションも参照してくださいcp)、正しい名前を選択しないかどうか心配しないでください。

答え3

「bak.php」を一度に追加できるように、拡張子なしでファイル名のコピーを保持する以外に、タブを完成させる方法はすぐには思い出されません。しかし、私の解決策は、ファイル名を入力として「firstpart.bak.extension」にコピーする小さなシェルスクリプトでした。

答え4

ソース管理を持たない複数のUNIXシステムでこの問題が発生し、迅速に小さな変更を行う必要がありました。この状況では、クイックリカバリのためにスクリプトを使用してファイルを切り取り、タイムスタンプ付きのコピーを作成します。 ls はファイルを表示し、その後にバージョン日付をファイル名でソートして表示します。

if [ "$1" = "" ]; then
   echo "File name required. Aborting."
   exit 1
fi

CDATE=`date +%Y-%m-%d-%H-%M`
cp "$1" "$1-$CDATE"
echo File backed up to: $1-$CDATE

使用法:

VERS.sh httpd.conf

出力:

File backed up to: httpd.conf-2016-07-14-10-27

関連情報