如何在linux目录中选择或查找新文件

如何在linux目录中选择或查找新文件

我想使用 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/

(与finds相反-newermt,它还会传输在 2022-10-14T00:00:00.000000000 修改的文件)。

要同时考虑子目录中的文件,请删除 -maxdepth 1或替换./file./**/filein zsh。请注意,find还会考虑隐藏目录中的文件。如果您也想要该行为,请添加Dglob 限定符。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- 在传输期间压缩文件数据,以减少传输数据部分的大小。

相关内容