如何使用 gnu cp 命令将文件复制到多个目录
- 2024-11-05 08:37:00
- admin 原创
- 32
问题描述:
是否可以使用 cp 命令将单个文件复制到多个目录?
我尝试了以下方法,但没有效果:
cp file1 /foo/ /bar/
cp file1 {/foo/,/bar}
我知道使用 for 循环或 find 是可能的。但是使用 gnu cp 命令可以吗?
解决方案 1:
您不能cp
单独执行此操作,但可以结合cp
使用xargs
:
echo dir1 dir2 dir3 | xargs -n 1 cp file1
将复制file1
到dir1
、、dir2
和dir3
。 xargs
将调用cp
3 次来执行此操作,有关详细信息,请参阅手册页xargs
。
解决方案 2:
不可以,cp
可以复制多个源,但只能复制到一个目标。您需要安排cp
多次调用(每个目标一次)来执行您想要的操作;使用您所说的循环或其他工具。
解决方案 3:
通配符也适用于 Roberts 代码
echo ./fs*/* | xargs -n 1 cp test
解决方案 4:
我会根据我在https://superuser.com/questions/32630/parallel-file-copy-from-single-source-to-multiple-targets上看到的答案使用cat
并代替。tee
`cp`
例如:
cat inputfile | tee outfile1 outfile2 > /dev/null
解决方案 5:
据我所知,您可以使用以下内容:
ls | xargs -n 1 cp -i file.dat
-i
命令选项意味着cp
您将被询问是否用覆盖当前目录中的文件file.dat
。虽然这不是一个完全自动的解决方案,但对我来说它很有效。
解决方案 6:
这些答案看起来都比显而易见的要复杂得多:
for i in /foo /bar; do cp "$file1" "$i"; done
解决方案 7:
ls -db di*/subdir | xargs -n 1 cp File
-b
如果目录名称中有空格,否则它将被 xargs 破坏为不同的项目,echo 版本存在此问题
解决方案 8:
本质上不使用 cp,但是......
这个问题是我在将大量 Gopro 镜头从(慢速)SD 卡复制到三个(慢速)USB 驱动器时想到的。我只想读取一次数据,因为这需要很长时间。而且我希望它是递归的。
$ tar cf - src | tee >( cd dest1 ; tar xf - ) >( cd dest2 ; tar xf - ) | ( cd dest3 ; tar xf - )
(如果您想要更多输出,可以添加更多 >() 部分。)
我还没有对此进行基准测试,但它肯定比 cp-in-a-loop(或一堆并行 cp 调用)快得多。
解决方案 9:
如果你想不使用分叉命令来执行此操作:
tee <inputfile file2 file3 file4 ... >/dev/null
解决方案 10:
要在 Mac OS 上使用通配符复制到目录,对我而言,目录名中包含xargs
空格的唯一解决方案是:
find ./fs*/* -type d -print0 | xargs -0 -n 1 cp test
test
要复制的文件在哪里
以及./fs*/*
要复制到的目录
问题是 xargs 将空格视为一个新参数,使用-d
或更改分隔符的解决方案-E
不幸在 Mac OS 上无法正常工作。
解决方案 11:
本质上相当于 xargs 答案,但如果您想要并行执行:
parallel -q cp file1 ::: /foo/ /bar/
例如,要将 file1 复制到当前文件夹的所有子目录中(包括递归):
parallel -q cp file1 ::: `find -mindepth 1 -type d`
注意:这可能只会在非常特定的用例中带来明显的速度提升,例如,如果每个目标目录都是一个不同的磁盘。
它在功能上也类似于 xargs 的“-P”参数。
解决方案 12:
不可以。
我多次发现我可以使用此功能,因此我制作了自己的工具来为我完成此功能。
http://github.com/ddavison/branch
非常简单 -
branch myfile dir1 dir2 dir3
解决方案 13:
ls -d */ | xargs -iA cp file.txt A
解决方案 14:
假设您想要复制fileName.txt
到当前工作目录内的所有子目录。
获取所有子目录名称
ls
并将它们保存到某个临时文件中,例如,allFolders.txt
ls > allFolders.txt
打印列表并将其传递给命令
xargs
。
cat allFolders.txt | xargs -n 1 cp fileName.txt
解决方案 15:
另一种方法是使用 cat 和 tee,如下所示:
cat <source file> | tee <destination file 1> | tee <destination file 2> [...] > <last destination file>
不过我认为这会非常低效,因为作业会被拆分到多个进程中(每个目标一个进程),硬盘会同时将多个文件写入磁盘的不同部分。但是,如果您想将文件写入多个不同的驱动器,这种方法可能非常高效(因为所有复制都可以同时进行)。
解决方案 16:
使用 Bash 脚本
DESTINATIONPATH[0]="xxx/yyy"
DESTINATIONPATH[1]="aaa/bbb"
..
DESTINATIONPATH[5]="MainLine/USER"
NumberOfDestinations=6
for (( i=0; i<NumberOfDestinations; i++))
do
cp SourcePath/fileName.ext ${DESTINATIONPATH[$i]}
done
exit
解决方案 17:
如果要将多个文件夹复制到多个文件夹,可以执行以下操作:
echo dir1 dir2 dir3 | xargs -n 1 cp -r /path/toyourdir/{subdir1,subdir2,subdir3}
解决方案 18:
如果所有目标目录都与路径表达式匹配(例如,它们都是的子目录path/to
),那么只需与以下内容find
组合使用:cp
find ./path/to/* -type d -exec cp [file name] {} ;
就是这样。
解决方案 19:
如果您需要具体说明将文件复制到哪些文件夹,可以将 find 与一个或多个 grep 结合使用。例如,要替换任何子文件夹中出现的 favicon.ico,您可以使用:
find . | grep favicon.ico | xargs -n 1 cp -f /root/favicon.ico
解决方案 20:
这将复制到直接子目录,如果您想更深入地了解,请调整-maxdepth
参数。
find . -mindepth 1 -maxdepth 1 -type d| xargs -n 1 cp -i index.html
如果你不想复制到所有目录,希望你可以过滤掉你不感兴趣的目录。例如复制到以 开头的所有文件夹a
find . -mindepth 1 -maxdepth 1 -type d| grep /a |xargs -n 1 cp -i index.html
如果要复制到任意/不相交的目录集,则需要 Robert Gamble 的建议。
解决方案 21:
我喜欢将文件复制到多个目录中,例如:cp file1 /foo/; cp file1 /bar/; cp file1 /foo2/; cp file1 /bar2/
并将目录复制到其他目录中:cp -r dir1/ /foo/; cp -r dir1/ /bar/; cp -r dir1/ /foo2/; cp -r dir1/ /bar2/
我知道这就像发出几个命令,但是当我想输入一行然后走开一会儿时,它对我来说很有效。
解决方案 22:
例如,如果您位于目标文件夹的父目录中,则可以执行以下操作:
对于 $(ls) 中的 i;执行 cp 源文件 $i;完成
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件