Bash

如何同時移動和重新創建文件夾?

  • April 30, 2017

我有一個statistics在 Ubuntu 伺服器中呼叫的文件夾,其中定期儲存數據文件。如何在重新創建可用於儲存新文件的文件statistics夾時重命名文件夾?backup-xx``statistics

文件statistics夾中的文件由 PHP 創建file_put_contents

我更喜歡重命名文件夾,因為文件夾中有很多文件statistics

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 工具盡可能地縮短了時間。

沒有辦法用另一個目錄原子地替換一個目錄。您可以移動舊目錄,然後創建一個新目錄:

mv statistics backup-xx
mkdir statistics

但這留下了一個statistics不存在的小時間視窗。如果某些程序可能隨時刪除目錄中的文件,這是一個問題。

為了有效地原子替換目錄,您需要使用符號連結。創建一個目錄,其名稱包括從開始的時間段:

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

(或者您想選擇目錄命名約定)。使用固定名稱創建指向目前位置的符號連結:

ln -s … statistics

要替換目錄,首先創建一個新目錄和一個新的符號連結,然後移動它以覆蓋舊的符號連結。請注意,mv符號連結上的普通文本和普通文本ln -s都不會這樣做:它們會在目標目錄中創建一個條目。GNU coreutilsln -snf也不適合,因為它會在創建新的符號連結之前刪除現有的符號連結,這會留下一個不存在路徑的小時間視窗。mv -T您可以在新的符號連結上使用 GNU coreutils 。

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

引用自:https://unix.stackexchange.com/questions/362102