使用cp将单个文件复制到多个目录


12

这个问题是我先前提出的问题的续集,该问题使用来创建许多目录mkdir

我正在使用bash外壳。我使用以下命令创建了五十个目录,每个目录以前缀“ s”开头:

mkdir $(printf "s%02i " $(seq 1 50))

用零填充到第二个数字。也就是说,我获得目录的形式为s01s02,..., ,。s49s50

现在,我想cp用来将一个文件(例如test.txt)复制到这五十个目录中的每个目录中。是否可以通过与上述类似的方式进行?例如,以下工作有效吗?我是Unix / Linux的新手,所以我真的不想尝试此操作,直到有人请给我表明它是安全的。

cp test.txt $(printf“ s%02i.txt” $(seq 1 50))

查看的man页面cp,它似乎不cp支持这样的多个目标,但是:

NAME
       cp - copy files and directories

SYNOPSIS
       cp [OPTION]... [-T] SOURCE DEST
       cp [OPTION]... SOURCE... DIRECTORY
       cp [OPTION]... -t DIRECTORY SOURCE...

DESCRIPTION
       Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY.

       Mandatory  arguments  to  long  options are mandatory for short options
       too.

Answers:


7

如果您想使用命令的输出将文件复制到使用的每个目录cp,则可以始终将其通过管道传输到xargs

printf "s%02i " $(seq 1 50) | xargs -n 1 cp test.txt

因为您事先知道输出的格式和内容,所以不必担心解析输出的安全性-碰到文件名中的元字符和空格的风险在这里并不是真正的问题。

或者,假设目录已经存在,则可以尝试以下操作:

find . -maxdepth 1 -type d -name 's[0-9][0-9]' -print0 | xargs -0 -I {} cp test.txt {}

或没有管道:

find . -maxdepth 1 -type d -name 's[0-9][0-9]' -exec cp test.txt {} \;

最后两个命令将在当前目录中找到所有文件cp test.txt。该-maxdepth 1选项将避免任何子目录也接收该文件。被警告,'s[0-9][0-9]'是对匹配s后跟任意两位数字,这意味着如果由于某种原因,你s99cwd,它也将收到的副本test.txt


8

您还可以让Shell for循环执行迭代。这是不依赖诸如parallel或的外部工具的最基本方法,xargs我发现最容易理解:

for name in $(printf "s%02i " $(seq 1 50)); do
    mkdir $name
    cp test.txt $name
done

还有一百万种其他方式可以编写此代码,例如:

for name in $(seq -w 1 50); do
    mkdir s$name
    cp test.txt s$name
done

如果要在执行之前验证要执行的操作,可以执行一些类似的命令echo,在命令之前加上,这将打印该行而不是执行该行:

for name in $(seq -w 1 50); do
    echo mkdir s$name
    echo cp test.txt s$name
done

输出:

mkdir s01
cp test.txt s01
mkdir s02
cp test.txt s02
mkdir s03
cp test.txt s03
# etc.


2

您也可以使用GNU parallel。假设您位于包含text.txt的目录中,并且您的50个目录位于/my/50dirs/path(如/my/50dirs/path/s01/my/50dirs/path/s02等)中,则可以运行:

seq -w 01 50 | parallel -j1 cp text.txt /my/50dirs/path/s{}

2
最好做到这一点parallel -j1,否则每个内核将有一个工作,而在多核计算机上,这些工作将竞争IO。
吉尔(Gilles)“所以,别再邪恶了”
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.