Linux

find 命令,僅在文件較新時執行

  • August 9, 2022

我有一個包含以下步驟的腳本:

  • 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

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