如何在Linux或者Unix中将单个文件复制到多个目录

时间:2020-01-09 10:42:11  来源:igfitidea点击:

如果如何通过一个cp命令将单个文件复制到三个位置(目录),是否可以?

答案是不。
您不能使用GNU/cp或者BSD/cp将单个文件复制到多个目录。
但是,在MacOS,Linux,FreeBSD,OpenBSD,NetBSD和类Unix系统中,您可以结合使用cp和xargs/parallel以及其他命令将单个文件复制到多个目录。

cp命令

cp命令的基本语法如下,将多个文件复制到一个目录中:

cp file1 /dir1/
cp file1 file2 file3 /dir1/

将文件复制到Unix或者Linux中的多个目录

诀窍是使用xargs命令或者GNU并行命令。

使用xargs将一个名为foo.txt的文件复制到多个目录/tmp/1 /,/tmp/2 /和/tmp/3

xargs命令构造参数列表并执行实用程序,例如cp或者mv。
语法为:

xargs -n 1 cp -v filename<<<"/dir1/ /dir2/ /dir3/" 
 
## 或者
echo "/dir1/ /dir2/ /dir3/" | xargs -n 1 cp -v filename

在此示例中,将/etc/passwd复制到/tmp/1 /,/tmp/2 /和$HOME/3 /,如下所示:

xargs -n 1 cp -v /etc/passwd

或者

echo "/tmp/1/ /tmp/2/ $HOME/3/" | xargs -n 1 cp -v /etc/passwd

输出示例:
使用Linux/Unix cp命令在不同目录中复制多个文件

使用并行将一个名为foo.txt的文件复制到多个目录/tmp/1 /,/tmp/2 /和/tmp/3

GNU parallel是一种Shell工具,用于使用一台或者多台计算机并行执行作业。
语法为:

parallel cp fileNameHere ::: /dir1/ /dir2/ /dir3/

在此示例中,将/etc/resolv.conf复制到/tmp/1 /,/tmp/2 /和$HOME/3 /,如下所示:

parallel cp -v /etc/resolv.conf ::: /tmp/1/ /tmp/2/ $HOME/3/

输出示例:

/etc/resolv.conf -> /tmp/2/resolv.conf
/etc/resolv.conf -> /tmp/1/resolv.conf
/etc/resolv.conf -> /Users/Hyman/3/resolv.conf

如何使用tee命令将文件复制到多个文件夹

假设您要将/etc/resolv.conf复制到/tmp/1 /和/tmp/2 /,则运行tee命令,如下所示:

tee /tmp/1/resolv.conf /tmp/2/resolv.conf < /etc/resolv.conf
tee /tmp/1/resolv.conf /tmp/2/resolv.conf < /etc/resolv.conf >/dev/null

您需要指定完整路径,例如/tmp/1/resolv.conf,否则会出现以下错误:

tee: /tmp/1/: Is a directory

如何使用find命令将文件同时复制到多个目录

find命令的语法如下:

find /dir1/ /dir2/ -maxdepth 0 -exec cp filename {} \;

要将/etc/hosts同时复制到Linux/Unix/MacOS/FreeBSD等下的/tmp/{1,2} /和$HOME/3 /文件夹中,请执行:

find /tmp/1/ /tmp/2/ $HOME/3/ -maxdepth 0 -exec cp /etc/hosts {} \;

输出示例:

/etc/hosts -> /tmp/1/hosts
/etc/hosts -> /tmp/2/hosts
/etc/hosts -> /Users/Hyman/3/hosts

shell循环

您还可以使用bash进行循环,如下所示:

for dest in /dir1/ /dir2/ ; do cp -v file "$dest" ; done
for dest in /tmp/1/ /tmp2/ $HOME/3/ ; do cp -v "/etc/resolv.conf" "$dest" ; done