Backup

用於過濾掉管道中不存在的文件的 Shell 命令

  • December 16, 2021

我正在尋找一種好方法來生成備份 tar.gz,該備份 tar.gz 將被提取另一個 tar.gz 覆蓋。

tar -ztf patch.tar.gz | grep -v "/$" | tar -T- -zcvf backup.tar.gz

這完美!但是,有時,新更新檔(patch.tar.gz)不僅會包含硬碟中已經存在的文件,還可能會添加不存在的新文件。這些不存在的文件將無法備份,第二個 tar 將產生錯誤。退出程式碼是2

tar:文件夾/file.txt:無法統計:沒有這樣的文件或目錄

tar:由於先前的錯誤而退出失敗狀態

**我正在尋找僅檢查文件存在(stdin)並在標準輸出上發送現有文件的 shell 命令。**它存在嗎?我需要這樣的東西:

tar -ztf patch.tar.gz | grep -v "/$" | filterfileexist | tar -T- -zcvf backup.tar.gz

我需要一個 shell 命令而不是 shell 腳本。

顯然,我可以自己用 C 語言實現這個 shell 命令,因為它非常簡單,但我希望找到一些通用的東西,可以在其他 UNIX 平台上找到。

嘗試為此使用 perl oneliner

cat filelist | perl -ne 'chomp(); if (-e $_) {print "$_\n"}' | tar -T- -zcvf backup.tar.gz

這裡有幾個選擇。

tar -ztf 更新檔.tar.gz | grep -v “/$” | xargs -i sh -c ’test -f {} && echo {}’ | tar -T- -zcvf 備份.tar.gz

或者

tar -ztf 更新檔.tar.gz | grep -v “/$” | tar –ignore-failed-read -T- -zcvf backup.tar.gz

第二個範例在嘗試備份不存在的文件(在 Centos 6.5 上測試)後將以狀態 0 退出,從而避免了該問題。

引用自:https://serverfault.com/questions/609886