使用直接父文件夹作为两个位置的引用,将整个目录从源复制到目标

使用直接父文件夹作为两个位置的引用,将整个目录从源复制到目标

**

  • 问题一:

** 先决条件:源和目标应具有相同的目录名称。目录的深度级别可能会有所不同,而不是名称

关于源和目标结构的注释:

  1. SampleFolder 和 Project1 是路径中唯一共同的部分
  2. 有多个目录需要复制
  3. 目录而不是在同一路径中,它们可能是一层深,两层深,所以基本上我需要在复制文件之前搜索参考文件夹
mydir
|__ sampleFolder/fil.txt
|__ Project1/fil2.txt

desDir
  |__ some_path/More_path/sampleFolder/
  |__ some_path/More_path/some_more_path/Project1/

目的:将文件夹中的文件复制mydir/sampleFolder/file.txtdesDir/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

相关内容