フォルダーの移動と再作成を同時に行うにはどうすればよいでしょうか?

フォルダーの移動と再作成を同時に行うにはどうすればよいでしょうか?

Ubuntu サーバーに、データ ファイルが定期的に保存される というフォルダーがあります。フォルダーを再作成しながら、新しいファイルを保存できるようにフォルダーstatisticsの名前を変更するにはどうすればよいですか?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適していません。新しいシンボリック リンクを作成する前に既存のシンボリック リンクを削除するため、パスが存在しない短い時間枠が残ります。新しいシンボリック リンクには GNU coreutils を使用できますmv -T

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/.

関連情報