Linux
find 命令,僅在文件較新時執行
我有一個包含以下步驟的腳本:
- 1 使用 lftp 鏡像遠端伺服器
open ftps://'[name]':'[pwd]'@[remote_host] set ssl:check-hostname no mirror --delete-first --only-newer /ExchangeSets /home/sandbox_autopilot/Exchangesets exit
- 2 接下來,我使用 find 命令根據文件名的開頭對文件進行排序,並將它們複製到文件夾中。
find /home/sandbox_autopilot/Exchangesets -iname '1R4*.000' -exec cp -u --target-directory /home/sandbox_autopilot/1R4/ {} \; find /home/sandbox_autopilot/Exchangesets -iname '1R5*.000' -exec cp -u --target-directory /home/sandbox_autopilot/1R5/ {} \; find /home/sandbox_autopilot/Exchangesets -iname '1R6*.000' -exec cp -u --target-directory /home/sandbox_autopilot/1R6/ {} \;
- 3 我對文件夾中的文件進行了一大堆 GIS 更改:與我的問題無關的 1R4、1R5、1R6。
重要的事情:
- 鏡像遠端伺服器後,文件夾 /home/sandbox_autopilot/Exchangesets 使用以 4 位數字開頭的子文件夾名稱進行排序,包含較新文件的文件夾比舊文件夾具有更高的 4 位數字(參見下面的範例)。
- /home/sandbox_autopilot/Exchangesets 中的文件夾結構中存在同一個文件的多個版本。“find -exec cp”命令要求的行為是將可用文件的最新版本放在目標目錄中。
文件夾 /home/sandbox_autopilot/Exchangesets 結構中的多個文件範例:
find . -name 1R65Y842.000 ./5704b_[projectname]/ENC_ROOT/1R/6/1R65Y842/1R65Y842.000 ./5721a_[projectname]/ENC_ROOT/1R/6/1R65Y842/1R65Y842.000 ./5673b_[projectname]/ENC_ROOT/1R/6/1R65Y842/1R65Y842.000 ./5618_[projectname]/ENC_ROOT/1R/6/1R65Y842/1R65Y842.000 ./5802b_[projectname]/ENC_ROOT/1R/6/1R65Y842/1R65Y842.000 ./5646a_[projectname]/ENC_ROOT/1R/6/1R65Y842/1R65Y842.000
注:該
$$ projectname $$由於隱私原因,在這個例子中都是不同的,但在這個例子中是空白的。 問題:
“find -exec cp”命令沒有給我 1R6 文件夾中的最新文件。
我認為這就是正在發生的事情。
- 在原始文件夾結構中,“lftp mirror”命令正確傳遞了文件上的日期。所以最新的文件有最新的日期。
- 當“find -exec cp”命令找到一個文件並將其複製到相關的 1R 文件夾時。文件日期設置為 now()。然後,當“find -exec cp”命令找到一個具有相同名稱且較新的文件時,它不會複製,因為目標目錄中的日期較新(now())然後是需要覆蓋的文件的文件日期目標目錄中的文件,從而使 cp 上的 -u 函式無用。
我正在考慮的解決方案:
- 我可以防止 cp 命令在將文件複製到目標目錄時更改文件的日期嗎?那麼 cp -u 可以評估正確的日期並將最新版本的文件放在目標目錄中嗎?
- 符號連結而不是製作實際副本會有所幫助嗎
- find 是否有一個選項可以評估找到的文件版本,並且只對文件的最新版本執行複制命令?
我謙虛的請求:
有人可以幫助我朝著正確的方向前進嗎?
cp 命令可以保留屬性,包括時間戳。最簡單的存檔方式:
cp -a
您保留所有屬性。從手冊:--preserve[=ATTR_LIST] preserve the specified attributes (default: mode,ownership,timestamps), if possible additional at‐ tributes: context, links, xattr, all
和
-a, --archive same as -dR --preserve=all