
我有一個名為statistics
in Ubuntu 伺服器的資料夾,其中定期儲存資料檔案。如何在重新建立資料夾以可用於儲存新檔案時將statistics
資料夾重新命名為?backup-xx
statistics
資料夾中的檔案statistics
是由 PHP 建立的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 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
答案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/.