![在AIX中,如何避免用cp覆盖文件?](https://linux22.com/image/207780/%E5%9C%A8AIX%E4%B8%AD%EF%BC%8C%E5%A6%82%E4%BD%95%E9%81%BF%E5%85%8D%E7%94%A8cp%E8%A6%86%E7%9B%96%E6%96%87%E4%BB%B6%EF%BC%9F.png)
我们需要定期将一些超过 2 天的大文件归档到 NAS,同时保留其目录树结构。这些文件在源目录中保留 7 天。
起初我们find
为此使用:
find ${SOURCE_DIR} -type f -mtime +2 -exec ksh -c 'mkdir -p $(dirname ${DEST_NAS_DIR}$0) && cp -p $0 ${DEST_NAS_DIR}$0' {} \;
然而我们注意到该脚本正在复制已经存档的文件,因此每次执行都需要太多时间。
cp 没有 -n / --no-clobber 选项。那么,如何避免覆盖目的地中的相同文件呢?任何想法?
问候!
答案1
如果rsync
您的系统上可用,您可以使用它的--ignore-existing
标志:
find ${SOURCE_DIR} -type f -mtime +2 \
-exec rsync --ignore-existing '{}' ${DEST_NAS_DIR} \;
可能该-u
标志可能很有趣 - 它会检查发送者是否也有现有文件的更新版本,如果有则更新它们。
看看你是否想要--archive
激活模式:这意味着递归并保留有关时间、所有权等的一些信息。查看man rsync
更多详细信息。
答案2
您可以尝试使用以下方法进行作弊:
...yes n|cp -i -p $0 ${DEST_NAS_DIR}$0' {}...
不幸的是,我没有 AIX 来测试它,但这将要求覆盖任何现有文件,并且发送“n”将阻止它。
PS 我目前没有在哪里测试它,所以请在使用真实文件之前进行测试。