我有一个包含以下步骤的脚本:
- 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
注意:[项目名称] 全部不同,但出于隐私原因在本示例中被空白。
问题:
“find -exec cp”命令没有给我 1R6 文件夹中的最新文件。
我认为这就是正在发生的事情。
- 在原始文件夹结构中,文件上的日期由“lftp镜像”命令正确传递。所以最新的文件有最新的日期。
- 当“find -exec cp”命令找到一个文件并将其复制到相关的1R文件夹中时。文件日期设置为 now()。然后,当“find -exec cp”命令找到较新的同名文件时,它将不会复制,因为目标目录中的日期较新(now()),然后是需要覆盖的文件的文件日期目标目录中的文件,从而使 cp 上的 -u 功能无用。
我正在考虑的解决方案:
- 我可以阻止 cp 命令在将文件复制到目标目录时更改文件的日期吗?那么 cp -u 可以评估正确的日期并将最新版本的文件放入目标目录中吗?
- 符号链接而不是制作实际副本是否有帮助
- find 上是否有一个选项可以评估找到的文件版本,并仅对文件的最新版本执行复制命令?
我的谦卑请求:
任何人都可以帮助我朝正确的方向前进吗?
答案1
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