フォルダを移動して同時に再作成するには?

フォルダを移動して同時に再作成するには?

statisticsデータファイルが定期的に保存されるUbuntuサーバーにフォルダがあります。新しいファイルを保存するためにフォルダを再作成するときにフォルダの名前を変更するにはどうすればよいですかstatisticsbackup-xxstatistics

フォルダ内のファイルはstatisticsPHPによって生成されますfile_put_contents

私はフォルダに多くのファイルがあるので、フォルダの名前を変更することを好みますstatistics

答え1

いいえ原子的にあるディレクトリを別のディレクトリに置き換えます。古いディレクトリを移動して新しいディレクトリを作成できます。

mv statistics backup-xx
mkdir statistics

statisticsしかし、それは存在しない小さな時間の窓を残します。これは、一部のプロセスがいつでもディレクトリ内のファイルを削除できる場合に問題になります。

ディレクトリをアトミックに効果的に置き換えるには、シンボリックリンクを使用する必要があります。名前に最初から期間を含むディレクトリを作成します。

mkdir "statistics-$(date +%Y%m%d)"

(またはディレクトリの命名規則を選択したい)現在の場所の固定名を持つシンボリックリンクを作成します。

ln -s … statistics

ディレクトリを置き換えるには、まず新しいディレクトリと新しいシンボリックリンクを作成し、それを移動して古いシンボリックリンクを上書きします。mvシンボリックリンクのプレーンテキストとプレーンテキストの両方はこれを行いません。ln -s宛先ディレクトリ内にエントリを作成します。 GNU coreutils は、ln -snf新しいシンボリックリンクを作成する前に既存のシンボリックリンクを削除してパスが存在しない小さな時間を残すため、適切ではありません。mv -T新しいシンボリックリンクでGNU coreutilsを使用できます。

new_dir="statistics-$(date +%Y%m%d)"
mkdir "$new_dir"
ln -s statistics.new
mv -Tf statistics.new statistics

答え2

mv statistics backup-xx && mkdir statistics

これによりstatistics既存のディレクトリの名前がに変更されbackup-xx、成功すると新しいディレクトリの作成が進みますstatistics

より原子的な作業のためには、ディレクトリstatistics-001(または同様の形式で001今日の日付を適切な形式に置き換える)と次のシンボリックリンクを作成することを検討してくださいstatistics

mkdir statistics-001
ln -s statistics-001 statistics

新しいデータがきれいなディレクトリに入るようにこのディレクトリを「回転」するには、まずディレクトリを作成してから、statisticsそのディレクトリへのリンクを再作成します。

mkdir statistics-002
ln -sf statistics-002 statistics

mv statistics-001 backup-001

これにより、そのstatisticsディレクトリ(つまり、シンボリックリンクが指すディレクトリ)に書き込むすべてのプログラムがそのディレクトリを見つけることができません。

指定したディレクトリに対して特別な権限または所有権を設定する必要がある場合は、statisticsリンクを(再)作成する前にこれを設定してください。

1むしろこれを行うと、プログラムの実行にかかる時間がいいえ標準のUnixツールを使用して、効果的なターゲットディレクトリをできるだけ最小限に抑えます。

答え3

ディレクトリ名をまったく変更しないでください。ファイルが多いので、ディレクトリの名前を変更することを好むと言われました。私が考えるためにあなたがこれをしたいと思う唯一の理由は、ファイルをコピーするのに時間がかかりすぎるからです。しかし、移動する(つまり、名前の変更)ファイルは、同じファイルシステムの場所に移動するとすぐに完了します。私はそれがあなたがしたいことだと思います。なぜなら、ファイルシステムを変更すると、mvディレクトリやその内容を移動するのに多くの時間がかかるからです。cp

したがって、次のようにします。

mkdir backup-xx && mv statistics/* backup-xx

隠しファイルもインポートする必要がある場合は、次のことができます。

mkdir backup-xx && mv statistics/* statistics/.* backup-xx

または以下を使用する場合bash

shopt -s dotglob; mkdir backup-xx && mv statistics/* statistics/.* backup-xx

これにより、ディレクトリは常に存在しますが、簡単で迅速な操作でその内容を移動できます。

答え4

フォルダ自体を移動する代わりに、統計フォルダの内容を新しく作成されたディレクトリに移動できます。フォルダ全体を移動する場合は、別のコマンドを実行してディレクトリ権限を変更する必要があります。

mkdir -p <path>/backup-xxx
mv statistics/* <path>/backup-xxx/.

関連情報