我想使用 scp 从服务器备份 1 个目录。但我的问题是备份目录有太多文件(旧文件和新文件)。我只想复制新文件,例如 .
文件 1 - 最后修改:2022-10-11
文件 2 - 最后修改:2022-10-12
文件 3 - 最后修改:2022-10-13
文件 4 - 最后修改:2022-10-14
那么,我如何使用 find 命令只选择文件 4 ?因为我认为如果我选择新文件我可以使用 |和 scp 命令仅复制新文件。非常感谢
答案1
使用 zsh shell:
scp ./file*(.om[1]) host:target/dir/
scp
当前工作.
目录中名称以file
.
使用 GNU 实用程序和任何类似 Bourne 的 shell,您可以执行类似的操作:
{
{
LC_ALL=C find . -maxdepth 1 -name 'file*' -type f -printf '%T@\t%p\0' |
LC_ALL=C sort -z -k1,1rn |
head -zn1 |
cut -zf2-
} 4<&- |
xargs -0a /dev/fd/3 -I FILE scp FILE host:target/dir/ 3<&0 <&4 4<&-
} 4<&0
(未经测试)。
要使用 BSD/GNU 选择当地时间 2022-10-14T00:00:00 之后最后修改的文件find
:
LC_ALL=C find . -maxdepth 1 -name 'file*' -type f -newermt 2022-10-14 \
-exec sh -c 'exec scp "$@" host:target/dir/' sh {} +
或者与zsh
:
autoload after
scp ./file*(.e['after 2022-10-14']) host:target/dir/
(与find
s相反-newermt
,它还会传输在 2022-10-14T00:00:00.000000000 修改的文件)。
要同时考虑子目录中的文件,请删除 -maxdepth 1
或替换./file
为./**/file
in zsh
。请注意,find
还会考虑隐藏目录中的文件。如果您也想要该行为,请添加D
glob 限定符。zsh
排除隐藏目录find
是调用名称以开头的目录(此处为起始目录)-prune
以外的目录:.
.
LC_ALL=C find . -name '.?*' -prune -o ...
答案2
该find
命令具有按时间搜索文件的内置选项:
最后写时间(我喜欢修改):
find . -mtime n
最后读时间(比如使用权):
find . -atime n
+n
为了n天或更长时间-n
为了n天或更少n
正是为了n天
完整示例:
find . -mtime +6 -type f
将查找当前目录及其子目录中7天或更长时间修改的所有文件。
更多信息这里。
答案3
这并没有回答您关于查找最后一个文件的具体问题,但出于备份目的,最好使用rsync
而不是scp
.
从手册页rsync(1)
:
rsync 是一个程序,其行为方式与 scp 大致相同,但具有更多选项,并使用 rsync 远程更新协议来极大地提高性能。 当目标文件已存在时加快文件传输速度。Rsync应用广泛用于备份和镜像并作为日常使用的改进复制命令。
Rsync 使用“快速检查”算法(默认情况下)查找需要传输的文件查找大小或上次修改时间已更改的文件。当快速检查表明文件的数据不需要更新时,将直接在目标文件上对其他保留的属性(根据选项的请求)进行任何更改。
将当前工作目录复制到目标主机的示例:
rsync -avz ./ host:target/dir
-a
- 存档模式。这意味着它将递归复制整个文件夹,并保留权限、所有者、组和修改时间。-v
- 增加冗长程度。这将显示哪些文件已实际复制。-z
- 在传输期间压缩文件数据,以减少传输数据部分的大小。