用于“查找”的 printf 格式或在比较文件系统中的文件时控制差异的方法

用于“查找”的 printf 格式或在比较文件系统中的文件时控制差异的方法

在家工作时,我笔记本电脑上的内容发生了很多变化。在锁定之前,我通常在办公室,我可以手动将文件镜像到网络驱动器。

在家工作意味着无法访问网络。我必须使用列表命令将网络驱动器内容与笔记本电脑驱动器内容进行比较,例如:

touch ~/tmp/2021-07-25.txt -d 2021-07-25

stdbuf -i0 -o0 -e0 \
   find ~/!(tmp) ~/.[^.]* \
   -type f -newer ~/tmp/2021-07-25.txt \
   -printf '%p\t%CY%Cm%Cd.%CH%CM\t%s\n' \
   2>&1 | tee ~/tmp/find.out

“stdbuf”命令只是禁用后续命令的缓冲,以便我可以看到生命迹象。 “find”的文件/文件夹参数排除“tmp”并包括以“.”开头的所有文件/文件夹,但不包括当前文件夹“.”。本身而不是父文件夹“..”。 printf 子句以以下格式打印出文件信息:

File path <tab> YYYYMMDD.HHmm <tab> size

YYYY = 4-digit year
MM = 2-digit month
DD = 2-digit day-of-month
HH = 24-hour hour
MM = 2-digit minute

以上是针对笔记本电脑的。我可以远程访问现场桌面并对我的网络驱动器进行类似的列表以进行比较。在那里,find 的文件/文件夹参数仅包含“/i”(网络驱动器的字母驱动器映射)。该顶部文件夹不包含以“.”开头的文件/文件夹。我必须清理这两个列表以避免“~”和“/i”之间的差异。

我的下一步是从笔记本电脑和网络驱动器中“区分”列表。不幸的是,diff 很容易被路径的“dirname”部分中的共性所抛弃。我尝试修改find​​的printf格式以获得:

Basename <tab> File path <tab> YYYYMMDD.HHmm <tab> size

不幸的是,diff 很容易被误导来根据最初的几个字符来匹配文件。

我真正想要的是 diff 根据文件路径匹配行,然后匹配其后的字符,即基于 YYYYMMDD.HHmm 标记,然后根据大小。有没有办法引导 diff 这样做?

后记:我在两端都使用 Cygwin。不幸的是,在 Windows 环境中,与其他人共享(或来自其他人)的文件名称带有空格。某些文件夹名称还包含标点符号和空格。如果需要,我可以通过在文件路径后嵌入标记(例如“QQQQ”)来缓解问题,但 find 输出中的字段已由 <tab> 分隔。我仍然需要“diff”来匹配基于整个文件路径的行,然后在文件路径字段后查找差异(如果有)。

答案1

诚然,这个答案是不完整的,尤其是因为我没有可以测试的 Windows 计算机。但我首先要简要谈谈您的 IT 部门不提供 VPN 服务来方便您在家工作,从而给您带来的严重伤害。当然,在这个前所未有的时代,他们付出更大的努力将为你节省无数时间不必要的欺骗。

我能想到的唯一能接近满足您需求的解决方案是rsyncCygWin 上提供的。在家庭笔记本电脑和办公室网络驱动器之间创建可行的 SSH 链接时会出现问题。幸运的是,这可以说比某种与 Windows 兼容的临时文件diff系统更容易解决。您可能需要设置您的办公室机以 SSH 方式连接到您的家用笔记本电脑(在您的家用路由器上设置了 TCP 端口直通)。这反过来可能需要在某种动态 DNS 上设置您的家用笔记本电脑,以便办公室计算机可以可靠地通过 SSH 连接到它。我设想办公室机器将通过 SSH 连接到您的笔记本电脑,只是为了创建隧道 TCP 连接,以便绑定到您笔记本电脑上 IP 127.0.1.1 上的端口 22。那么从你的笔记本电脑到 127.0.1.1(你的办公室机器)的 rsync 应该不会有太大的飞跃。

简单来说:

  1. 在家庭路由器的 IP 上设置动态 DNS,以便可以通过已知的 DNS 名称访问它;

  2. 在家庭路由器上设置直通 TCP 端口(通常为端口 922);

  3. 设置 SSH VPN您的办公室机器可以启动通过办公室防火墙(因为您的 IT 部门显然不会容纳传入的 SSH 连接)将传出连接到家庭路由器动态 DNS 名称的端口 922,并配置您的家庭笔记本电脑以允许传入连接尝试绑定到任何已知的、未使用的本地(到您的笔记本电脑)IP 上的 TCP 端口。

一旦办公室计算机连接到您的家用笔记本电脑,SSH 隧道应该为您提供一个功能性的 VPN 隧道,您可以通过该隧道:

  • 从家用笔记本电脑通过 SSH 连接到 127.0.0.1 端口 2222(或您选择的某个未使用的端口)并登录到您的办公室计算机
  • rsync从家用笔记本电脑到127.0.0.1端口2222上传或下载文件

诚然,这是一个艰巨的任务,需要很多步骤。我怀疑 StackExchange 上已经有资源可以解决如何完成这些步骤。

您可能会找到更好的链接,但为了让您开始:

投票给ddclienthttps://apple.stackexchange.com/questions/75372/how-do-i-configure-dynamic-dns-when-my-router-does-not-support-it

简短的 SSH 隧道操作方法:如何配置与连接计算机的反向 SSH 连接?

通过探索这些资源以及您自己可能找到的其他资源,我相信您可以将更出色的解​​决方案的各个部分拼凑在一起,并将它们合并成满足您需求的可用工具。祝你好运!并发布您在完成这一系列任务时遇到的任何后续问题。

相关内容