web-dev-qa-db-ja.com

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

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

statisticsフォルダー内のファイルは、PHP file_put_contentsによって作成されます。

statisticsフォルダーには多くのファイルがあるため、フォルダーの名前を変更することをお勧めします。

9
Googlebot
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ディレクトリ(つまり、このシンボリックリンクが指すディレクトリ)に書き込むプログラムは、1 それを見つけることができません。

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

1むしろ、このようにして、プログラムが有効なターゲットディレクトリであるなしである時間は、標準のUnixツールを使用して、可能な限り最小限に抑えられます。

7
Kusalananda

アトミックディレクトリを別のディレクトリに置き換える方法はありません。古いディレクトリを移動してから、新しいディレクトリを作成できます。

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

ディレクトリの名前を変更しないでください。多くのファイルがあるので、ディレクトリの名前を変更する方がよいとおっしゃっていました。これが必要だと私が考えることができる唯一の理由は、ファイルのコピーに時間がかかりすぎるためです。ただし、ファイルが同じファイルシステム上の場所に移動されている限り、ファイルの移動(つまり、名前の変更)は瞬時に行われます。ファイルシステムを変更する場合、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

このようにして、ディレクトリは常にそこにありますが、その内容は単純で高速な操作で移動できます。

3
terdon

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

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