Tom*_*ner 201 linux bash shell
是否可以使用cp命令将单个文件复制到多个目录?
我尝试了以下,但没有用:
cp file1 /foo/ /bar/
cp file1 {/foo/,/bar}
Run Code Online (Sandbox Code Playgroud)
我知道可以使用for循环,或者找到.但是可以使用gnu cp命令吗?
Rob*_*ble 572
你不能做到这一点cp孤单,但你可以结合cp使用xargs:
echo dir1 dir2 dir3 | xargs -n 1 cp file1
Run Code Online (Sandbox Code Playgroud)
将复制file1到dir1,dir2和dir3. xargs将调用cp3次来执行此操作,xargs有关详细信息,请参见手册页.
moo*_*dow 105
不,cp可以复制多个来源,但只会复制到一个目的地.您需要安排cp多次调用- 每个目标一次 - 用于您想要做的事情; 正如你所说,使用循环或其他工具.
小智 19
据我所见,您可以使用以下内容:
ls | xargs -n 1 cp -i file.dat
Run Code Online (Sandbox Code Playgroud)
该-i的选项cp命令意味着你会被询问是否覆盖文件与当前目录file.dat.虽然它不是一个完全自动化的解决方案,但它对我有用.
det*_*erb 17
我会使用cat并tee基于我在https://superuser.com/questions/32630/parallel-file-copy-from-single-source-to-multiple-targets中找到的答案而不是cp.
例如:
cat <inputfile> | tee <outfile1> <outfile2> > /dev/null
Run Code Online (Sandbox Code Playgroud)
小智 9
这些答案似乎都比显而易见的复杂:
for i in /foo /bar; do cp "$file1" "$i"; done
Run Code Online (Sandbox Code Playgroud)
不使用cp本身,但......
在将(慢速)SD卡上的大量Gopro素材复制到三个(慢速)USB驱动器的背景下,我想到了这一点.我想只读一次数据,因为它需要永远.我希望它是递归的.
$ tar cf - src | tee >( cd dest1 ; tar xf - ) >( cd dest2 ; tar xf - ) | ( cd dest3 ; tar xf - )
Run Code Online (Sandbox Code Playgroud)
(如果你想要更多的输出,你可以添加更多的那些>()部分.)
我没有对此进行基准测试,但它肯定比cp-in-a-loop(或一堆并行的cp调用)快得多.
要xargs在 Mac OS 上使用通配符复制到目录,唯一对我有用的目录名称中有空格的解决方案是:
find ./fs*/* -type d -print0 | xargs -0 -n 1 cp test
Run Code Online (Sandbox Code Playgroud)
test要复制的文件在哪里
以及./fs*/*要复制到的目录
问题是 xargs 将空格视为新参数,使用-d或-E不幸的是无法在 Mac OS 上正常工作的解决方案来更改分隔符。