我正在尝试将大量文件从远程服务器(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
在远程计算机上运行,因此它无法将文件复制到您的当地的机器。为此,您需要远程主机发送文件及其元数据的序列化,例如使用pax
libarchivebsdtar
或 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 将找到的文件从远程计算机复制到本地计算机。祝你好运。