传递变量以使用 newermt 选项在远程服务器上查找文件

传递变量以使用 newermt 选项在远程服务器上查找文件

我正在尝试将大量文件从远程服务器(serverB)复制到本地服务器(serverA)。我正在使用-newermt中的选项find来指定我的时间范围。

我只想在远程服务器 (serverB) 上保留 10 天的数据。我使用以下代码:

a=10
b=9

x=$(date +%Y%m%d -d "$a days ago")
y=$(date +%Y%m%d -d "$b days ago")

echo $x
echo $y

#create a directory on local server

mkdir -p /fileData/fileBackup$x-$y  

ssh dbadmin@ip find /fileData/Backup -maxdepth 1 -name "*" -type f -newermt $x -not -newermt $y -exec cp -pr {}\;  /fileData/fileBackup$x-$y/

但是,我得到以下输出,以错误消息结尾:

20230512
20230513

find: paths must precede expression: 

Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

bash: /fileData/fileBackup20230512-20230513/: No such file or directory

答案1

请记住ssh运行一个 shell 来解释与其参数的空格的串联。需要*为本地 shell 和远程 shell 引用它,但-name '*'没有多大意义,除非您想排除在用户区域设置中不是有效文本的文件名(但您还想检查所有目录组件(-path '*'并非所有find实现都会这样做)。

a=10
b=9
x=$(date -d "$a days ago" +%F)
y=$(date -d "$b days ago" +%F)
ssh dbadmin@ip "
  mkdir -p /fileData/fileBackup$x-$y &&
    find /fileData/Backup \
      -maxdepth 1 \
      -type f \
      -newermt $x \
      ! -newermt $y \
      -exec cp -pt /fileData/fileBackup$x-$y {} +
"

还:

  • -r对于常规文件没有意义。
  • 对于 GNU cp(您已经在使用许多 GNUism),您可以使用-t dest指定目标,该目标允许您传递多个参数,而cp不必使用sh对参数重新排序。
  • 我会使用 YYYY-MM-DD 格式(如 所示%F)而不是 YYYYMMDD,因为这是标准格式。
  • 另请参阅-mtime与 的组合-daystart作为-newermt此处的替代方案。
  • 我建议养成在-d spec非选项(如 )之前传递选项(如+%F)的习惯,因为这就是 POSIX 标准要求的方式,甚至 GNU 实用程序通常允许在非选项之后传递选项,它们仅在以下情况下才这样做$POSIXLY_CORRECT不在环境中。无论如何,-d这都不是标准date选项。
  • cp在远程计算机上运行,​​因此它无法将文件复制到您的当地的机器。为此,您需要远程主机发送文件及其元数据的序列化,例如使用paxlibarchivebsdtar或 GNUtar并将其提取到本地:
a=10
b=9
x=$(date -d "$a days ago" +%F)
y=$(date -d "$b days ago" +%F)
mkdir -p /fileData/fileBackup$x-$y &&
  ssh dbadmin@ip "
    find /fileData/Backup \
      -maxdepth 1 \
      -type f \
      -newermt $x \
      ! -newermt $y \
      -print0 |
      bsdtar --format pax --null -cT - -f- |
      gzip -1
  " | bsdtar -C "/fileData/fileBackup$x-$y" -xpf - -'s:.*/::'

这里使用gzip -1压缩流来节省带宽。如果在低带宽链路上,您可能希望使用压缩效果更好的东西,即使速度较慢。如果在高带宽链路上,压缩速度会更快,即使效果不是很好。gzip在这两个方面都不是很好,但它的优点是几乎无处不在。


至少在 GNU 的情况下find,这取决于系统fnmatch()用于将字符串与文件名模式进行匹配的功能。

答案2

这是因为您试图将找到的文件复制到远程计算机上的“/fileData/fileBackup$x-$y/”目录而不是本地计算机上(这是最后一行所做的),并且错误是因为有远程计算机上没有这样的目录,也许您可​​以使用 scp 将找到的文件从远程计算机复制到本地计算机。祝你好运。

相关内容