現在のディレクトリ内のすべてのエントリを現在のディレクトリの下のサブディレクトリにバックアップするか、サブディレクトリがない場合は新規作成します。

現在のディレクトリ内のすべてのエントリを現在のディレクトリの下のサブディレクトリにバックアップするか、サブディレクトリがない場合は新規作成します。

現在のサブディレクトリが事前に作成されたと仮定し、現在のディレクトリのすべての内容をサブディレクトリにコピーする次のコマンドがあります。

cp -p !($PWD/bakfiles2) bakfiles2/

しかし、時には以前にアクセスしたことがないフォルダにアクセスする必要があるため、「bakfiles2」サブディレクトリがない可能性があります。どういうわけか、現在のタイムスタンプを使用してバックアップディレクトリを作成できます(既存のディレクトリとの競合を避けるため)。シングルコピーコマンドまたはbashスクリプトを使用しますか?

スクリプトが特定のパターンで始まるすべてのサブディレクトリを無視し、ディレクトリ名に対してそのパターンを保持できる場合はbackup良いでしょう_bak_*メモ:*は任意の文字数を意味します)。

答え1

cpこのコマンドには、処理中にターゲットディレクトリがない場合はターゲットディレクトリを作成するオプションはありませんが、スクリプトを介してこれを実行できます。

rsyncまたは、最後のレベルにのみターゲットディレクトリが存在しない場合は、ターゲットディレクトリを作成できるコマンドを使用します。

rsync -rv --exclude='_bak_*/' /path/in/source/ /path/to/destination
  • インポートを実行すると、/ソース/path/in/source/ディレクトリ自体がコピーされるのを防ぎ、--excludeディレクトリを一致する名前と同期しないオプションが追加されます。

答え2

date次のコマンドを使用して現在のタイムスタンプを取得できます。

date +'%Y%m%d_%H%M%S'

再帰コピーを使用しない限り、ディレクトリの内容はすでに存在するディレクトリにのみコピーできます。ただし、古いバックアップディレクトリを新しいバックアップディレクトリにコピーする場合を除き、再帰コピーは使用できません。

したがって、この作業は数ステップで完了する必要があります。

backup_dir="_bak_$(date +'%Y%m%d_%H%M%S')"
mkdir "$backup_dir"
cp -p !(_bak_*) "$backup_dir/"

作成したとおり、ドットファイル(文字で始まるファイル)はコピーされないことに注意してください。.これらのファイルは通常シェルで特別に処理されるためです。 (この機能を利用する.bak_*には、代わりにバックアップディレクトリ名を指定することをお勧めします_bak_*。これで可能ですcp -p * "$backup_dir/"。)

小さな関数やスクリプトで作成できない理由がないので、まだコマンドです。

関連情報