Command-Line

將目前目錄的所有內容備份到目前目錄內的子目錄中,如果不存在則創建

  • December 20, 2018

現在我有以下命令將目前目錄的所有內容複製到子目錄,前提是子目錄是提前創建的:

cp -p !($PWD/bakfiles2) bakfiles2/

但是有時我必須訪問那些我以前從未訪問過的文件夾,因此那裡可能不存在子目錄“bakfiles2”,我能否以某種方式創建具有目前時間戳的備份目錄(以避免與任何現有目錄發生衝突),在使用單個複制命令或 bash 腳本時會飛嗎?

如果腳本可以忽略以特定模式開頭的任何子目錄,然後可以為backup目錄名稱保留_bak_*注意: * 表示任意數量的任意字元),那就太好了。

cp如果在應對時不存在,命令沒有創建目標目錄的選項,但您可以通過腳本來實現。

rsync或者如果僅在最後一級不存在,則只需使用可以創建目標目錄的命令。

rsync -rv --exclude='_bak_*/' /path/in/source/ /path/to/destination
  • 請注意,/引入/path/in/source/將阻止處理源目錄本身並添加--exclude選項以不同步具有匹配名稱的目錄。

date您可以使用命令獲取目前時間戳

date +'%Y%m%d_%H%M%S'

除非您使用遞歸副本,否則您只能將目錄的內容複製到已存在的目錄中。但是,除非您希望以前的備份目錄也複製到新的備份目錄,否則您不能使用遞歸副本。

所以這必須分幾步完成

backup_dir="_bak_$(date +'%Y%m%d_%H%M%S')"
mkdir "$backup_dir"
cp -p !(_bak_*) "$backup_dir/"

請記住,正如所寫的那樣,這不會複製點文件(以.字元開頭的文件),因為這些文件通常由 shell 特殊處理。(您可能需要考慮命名您的備份目錄.bak_*,而不是_bak_*從該功能中受益。然後您可以cp -p * "$backup_dir/"

沒有理由不能將它創建為一個小函式或腳本,所以它仍然只有一個命令。

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