如何在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