我们使用rsync将一些(百万)文件从Windows(NTFS / CYGWIN)服务器传输到Linux(RHEL)服务器。 我们希望强制Linux机器上的所有文件和目录名都是小写的。
有没有办法使rsync自动将所有文件和目录名称转换为小写? 例如,假设源文件系统有一个名为:
/foo/BAR.gziP
Rsync会创build(在目标系统上)
/foo/bar.gzip
显然,NTFS是不区分大小写的文件系统,不会有任何冲突…
失败的rsync选项的可用性,是否有一个增强版本或其他方式来实现这种效果? 也许CYGWIN上的一个挂载选项? 也许在Linux上有一个类似的挂载选项?
它的RHEL,以防万一。
您可以在rsync 之后更改目标服务器上生成的文件名的大小写。 我不会试图做这个中间传输(如果你需要重新启动副本)。 至于在Linux端进行更改,您需要确定是否有任何冲突。 您还需要确定是否需要更改目录名称的情况。 所有的名字都是唯一的吗? 如果是这样,一个适当的find脚本再加上tr或rename命令可以完成这个工作。
# Examples - Don't run directly `rename 'y/AZ/az/' *` # would change case on files within a directory.
您可以挂载不区分大小写的文件系统。 看看这个post 。
此外,这个页面build议创buildFAT32types的磁盘映像并安装它。 创build的fs将不区分大小写,例如任何Windows分区。
使用这样的解决scheme将消除将所有这些数百万个文件转换为小写的需要。
不是最优雅的解决scheme,但是您可以使用LD_PRELOAD来覆盖相关的系统调用并强制所有内容都为小写。 我认为这很有趣,所以我做了一点概念certificate,并…
> ls in out in: CyltApJik keumyomDu LidusIcweo spydjiPa SycsEyror tusUngEg out: > rsync -av in/ --rsync-path='env LD_PRELOAD=$PWD/lowercase.so rsync' localhost:out/ sending incremental file list ./ CyltApJik LidusIcweo SycsEyror keumyomDu spydjiPa tusUngEg sent 372 bytes received 129 bytes 1002.00 bytes/sec total size is 0 speedup is 0.00 > ls out cyltapjik keumyomdu lidusicweo spydjipa sycseyror tusungeg
这里是样本,这可能需要几次迭代才能够完全同步整个事物。
> cat lowercase.c #include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #define __USE_GNU #include <dlfcn.h> static int (*real_lstat) (const char *, struct stat *) = NULL; static int (*real_rename)(const char *, const char *) = NULL; char * lowered(const char * string) { char * low = strndup(string, 2048); char * c; if (low == NULL) return NULL; for (c = low; *c; c++) { *c = tolower(*c); } return low; } int lstat(const char * path, struct stat * buf) { int ret = 0; if (real_lstat == NULL) { real_lstat = dlsym(RTLD_NEXT, "lstat"); } ret = real_lstat(path, buf); if (ret == 0) return ret; ret = real_lstat(lowered(path), buf); return ret; } int rename (__const char *__old, __const char *__new) { if (real_rename == NULL) { real_rename = dlsym(RTLD_NEXT, "rename"); } return real_rename(__old, lowered(__new)); } > gcc -ldl -fPIC -shared -o lowercase.so lowercase.c