如何同時移動和重新創建文件夾?
我有一個
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