**
- 问题一:
** 先决条件:源和目标应具有相同的目录名称。目录的深度级别可能会有所不同,而不是名称
关于源和目标结构的注释:
- SampleFolder 和 Project1 是路径中唯一共同的部分
- 有多个目录需要复制
- 目录而不是在同一路径中,它们可能是一层深,两层深,所以基本上我需要在复制文件之前搜索参考文件夹
mydir
|__ sampleFolder/fil.txt
|__ Project1/fil2.txt
desDir
|__ some_path/More_path/sampleFolder/
|__ some_path/More_path/some_more_path/Project1/
目的:将文件夹中的文件复制mydir/sampleFolder/file.txt
到desDir/some_path/sampleFolder/file.txt
注意:源路径和目标路径的路径层次结构不同,但sampleFolder
相同
命令
find $HOME/mydir/ -type f -name *.txt -exec sh -c 'cp {}' 'find $HOME/des_dir -type d -path `echo $(dirname -- {}) | sed s"~$HOME/mydir~~g"`' sh {} \;
命令分解 1:这将获取父目录并$HOME/mydir
从搜索的*.txt
文件路径中删除
echo $(dirname -- {}) | sed s"~$HOME/mydir~~g"
命令分解 2:这将搜索执行命令分解 1 后收到的路径匹配字符串
find $HOME/des_dir -type d -path
命令分解 3:这很常见(我猜)
find $HOME/mydir/ -type f -name *.txt -exec sh -c 'cp {}'
**
- 问题2
** 使用下面的命令解决了问题 1,如果我在 cygwin 中将其作为独立命令运行,它就可以正常工作
find $HOME/MY_DIR/ -type d -name data -exec sh -c 'rsync -avz {} `find $HOME/DES_DIR-type d -name $(basename $(dirname -- {}))`' sh {} \;
但如果我在 shell 脚本中使用此命令并在 cygwin 中运行脚本,则会出现错误
protocol version mismatch - is your shell clean?
(see the rsync man page for an explanation)
rsync error: protocol incompatibility (code 2) at compat.c(60)
答案1
您想要执行的操作有点模糊,但rsync
如果您打算复制整个目录,则可能适合。
例如
$ rsync -avz level2 level3/test/
sending incremental file list
level2/
level2/out.txt
level2/rds.aws.test.lambda.json
sent 380 bytes received 58 bytes 876.00 bytes/sec
total size is 341 speedup is 0.78
$ ls level3/test/
level2
$ ls level3/test/level2/
out.txt rds.aws.test.lambda.json
如果您只需要 *.txt 文件并保留目录结构,则需要将R
选项添加到 rsync
$ rsync -avzR level2/*.txt level3/test2
sending incremental file list
level2/
level2/out.txt
sent 178 bytes received 39 bytes 434.00 bytes/sec
total size is 65 speedup is 0.30
$ ls level3/test2/level2/
out.txt