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