如何在Linux中使用一个命令将文件复制到多个目录

时间:2020-01-09 10:44:55  来源:igfitidea点击:

使用Linux命令行复制文件很容易。但是,如果要将同一文件复制到几个不同的位置怎么办?这也很容易,并且很好地向我们展示了如何使用一个命令来执行该操作。

通常,要复制一个文件,可以使用" cp"命令,链接到源文件和目标目录:

cp ~/Documents/FileToBeCopied.txt ~/TextFiles/

要将其复制到另外两个目录中,许多人将在不同的目的地再运行该命令两次:

cp ~/Documents/FileToBeCopied.txt ~/Dropbox/
cp ~/Documents/FileToBeCopied.txt /media/lori/MYUSBDRIVE/

但是,我们可以使用一个命令执行相同的任务:

echo dir1 dir2 dir3 | xargs -n 1 cp file1

这是此命令的工作方式。 " echo"命令通常会写入屏幕。但是,在这种情况下,我们希望将echo命令的输出作为xargs命令的输入。为此,我们使用管道符号(|)将一个命令的输出作为输入传递给另一个命令。 xargs命令将运行cp命令3次,每次将从echo命令返回到它的下一个目录路径添加到cp命令的末尾。有三个参数传递给xargs,但是xargs命令上的-n 1选项告诉它每次运行时仅一次将这些参数之一添加到cp命令中。

因此,以前面的示例为例,可以将上述三个单独的cp命令合并为一个命令,如下所示:

echo ~/TextFiles/ ~/Dropbox /media/lori/MYUSBDRIVE | xargs -n 1 cp ~/Documents/FileToBeCopied.txt

请注意,如果要复制的文件存在于指定的任何目标目录中,则该目标中的文件将被自动替换。不会询问我们是否要替换文件。 (通常,当我们使用cp命令将文件复制到单个位置时,可以添加-i选项以询问是否要替换现有文件。但是,-i选项是交互式选项(它会导致cp命令要求用户输入),并且与xargs结合使用时,不能将cp选项与交互式方法一起使用。)

需要考虑的另一件事是,如果我们要复制一个很大的文件,则可能需要在上述单个命令的cp命令中添加no-clobber(-n)选项。如果目标中已经存在文件,此选项会自动防止文件被覆盖。如果我们通过网络复制非常大的文件,可能会很慢,并且我们可能希望避免使用复制和替换文件所需的资源。以下命令添加-n选项,并且不会将文件复制到echo语句的参数中列出的任何目标位置(如果该目标位置中已经存在该文件)。

echo ~/TextFiles/ ~/Dropbox /media/lori/MYUSBDRIVE | xargs -n 1 cp -n ~/Documents/FileToBeCopied.txt

在Linux中的命令行上键入man echo,man xargs或者man cp,以获取有关这些命令中任何命令的更多信息。