使用cp命令复制单个文件到多个目录是否可能?
我尝试了以下命令,但都没有成功:
cp file1 /foo/ /bar/
cp file1 {/foo/,/bar}
我知道可以使用for循环或者find命令实现,但是是否可以使用GNU的cp命令来实现?
你不能仅使用 cp
来完成此操作,但你可以将 cp
与 xargs
结合使用:
echo dir1 dir2 dir3 | xargs -n 1 cp file1
将file1
复制到dir1
、dir2
和dir3
。使用xargs
调用cp
3次完成此操作,请参阅xargs
的man页面获取详细信息。
不,cp
可以复制多个源文件,但只能复制到单个目标文件。如果你想要实现你所需的功能,你需要安排多次调用cp
,每次对应一个目标文件,使用循环或其他工具,就像你说的那样。
通配符也适用于Roberts的代码
echo ./fs*/* | xargs -n 1 cp test
echo ../* | xargs -n 1 cp .DS_Store
运行良好。幸运的是,除了自己以外,所有目标都被复制了。
cp: ../my-current-folder/.DS_Store and .DS_Store are identical (not copied).'
在第一次测试运行中,我使用了 test.txt
,然后轻松批量删除了 rm ../*/test.txt
。复制.DS_Store
文件也成功了。P.S.:不幸的是,Finder文件夹视图定制没有传播。但这是另一个问题。 - porg根据我在https://superuser.com/questions/32630/parallel-file-copy-from-single-source-to-multiple-targets看到的答案,我会使用cat
和tee
来代替cp
。
例如:
cat inputfile | tee outfile1 outfile2 > /dev/null
cat <inputfile> | tee /path-to-files/outfile{1..4} > /dev/null
- Samueltee < inputfile outfile1 outfile2 > /dev/null
这个模式也是非常有用的,正如 Taywee 的回答所示。请注意使用 '<' 进行 io 重定向,这样就不需要从 cat 进行管道传输了。 - Alex Telon据我所见,您可以使用以下内容:
ls | xargs -n 1 cp -i file.dat
cp
命令的 -i
选项表示当你要将 file.dat
文件复制到当前目录下时,它会询问你是否要覆盖该目录下的同名文件。虽然这不是完全自动化的解决方案,但对我有用。
-i
保护是好的,但这不会提示您覆盖每个文件吗?而不是复制到目录中? - Hedgehogcp: overwrite
问题,但我不需要回答任何一个问题,它也没有覆盖文件。 - Evgeni Sergeev这些答案都比明显的答案更加复杂:
for i in /foo /bar; do cp "$file1" "$i"; done
for d in */ ; do cp $file "$i" done
。 - FantomX1for i in */ ; do cp $file "$i" done
?但还是谢谢你们两个。 - Torstenls -db di*/subdir | xargs -n 1 cp File
-b
的作用是在目录名中有空格时,避免被xargs误认为不同的项,因为这种情况下echo版本会存在问题。
并非直接使用cp命令,而是...
这是我在将大量Gopro录像从(缓慢的)SD卡复制到三个(缓慢的)USB驱动器时遇到的问题。我只想读取数据一次,因为它需要很长时间。我还想递归地进行操作。
$ tar cf - src | tee >( cd dest1 ; tar xf - ) >( cd dest2 ; tar xf - ) | ( cd dest3 ; tar xf - )
如果在 Mac OS 上使用 xargs
复制文件到带有通配符的目录中,而且该目录名称中包含空格,那么唯一适用于我的解决方案是:
find ./fs*/* -type d -print0 | xargs -0 -n 1 cp test
其中test
是要复制的文件,./fs*/*
是要复制到的目录。
问题在于xargs将空格视为新参数,使用-d
或-E
更改分隔符字符的解决方案在Mac OS上不起作用。
tee <inputfile file2 file3 file4 ... >/dev/null
cp
命令来完成这个任务。”仅仅因为答案试图通过提供另一种方法来帮助你,并不意味着问题没有得到回答。 - Nicoleecho dir[1-3] | xargs -n 1 cp filename
)。 - Jason