Bash:recursion地复制命名文件,保留文件夹结构

我希望:

cp -R src/prog.js images/icon.jpg /tmp/package 

会在目标目录中产生一个对称的结构:

 /tmp | +-- package | +-- src | | | +-- prog.js | +-- images | +-- icon.jpg 

而是将这两个文件复制到/ tmp / package中。 一个平面的副本。 (这是在OSX上)。

是否有一个简单的bash函数可用于将所有文件(包括由通配符指定的文件(例如src / *。js))复制到目标目录中的合适位置。 有点像“对于每个文件,运行mkdir -p $(dirname "$file"); cp "$file" $(dirname "$file") ”,但可能是单个命令。

这是一个相关的线程,这表明这是不可能的。 笔者的解决scheme对我来说并不是那么有用,因为我想简单地提供一个文件列表,通配符或不是,并且把它们全部复制到目标目录。 IIRC MS-DOS的xcopy这样做,但似乎没有等效的cp。

你有没有尝试过使用–parents选项? 我不知道OS X是否支持,但在Linux上。

 cp --parents src/prog.js images/icon.jpg /tmp/package 

如果这不适用于OS X,请尝试

 rsync -R src/prog.js images/icon.jpg /tmp/package 

如aif所示。

单程:

 tar cf - <files> | (cd /dest; tar xf -) 

或者,如果您是老派,请使用cpio:

 cd /source; find . -print | cpio -pvdmB /target 

显然,你可以过滤文件列表到你的心脏的内容。

'-p'选项是用于'pass-through'模式(相对于'-i'用于input或'-o'用于输出)。 '-v'是详细的(在处理文件时列出文件)。 '-m'保留修改时间。 '-B'表示使用'大块'(其中大块是5120字节而不是512字节); 有可能这几天没有效果。

rsync的-R选项将做你所期望的。 这是一个function非常丰富的文件复印机。 例如:

 $ rsync -Rv src/prog.js images/icon.jpg /tmp/package/ images/ images/icon.jpg src/ src/prog.js sent 197 bytes received 76 bytes 546.00 bytes/sec total size is 0 speedup is 0.00 

样品结果:

 $ find /tmp/package /tmp/package /tmp/package/images /tmp/packagehttp://img.dovov.comicon.jpg /tmp/package/src /tmp/package/src/prog.js 

rsync当然! 教程在这里。 和这里

或一致

尝试…

 for f in src/*.js; do cp $f /tmp/package/$f; done 

所以为了你原来在做什么…

 for f in `echo "src/prog.js images/icon.jpg"`; do cp $f /tmp/package/$f; done 

要么

 v="src/prog.js images/icon.jpg"; for f in $v; do cp $f /tmp/package/$f; done