使用括号扩展将文件复制到多个文件夹

使用括号扩展将文件复制到多个文件夹

我正在尝试使用大括号扩展将文件从一个文件夹复制到多个文件夹中,如下所示:

cp source_folder/source.json target_folder{1..11}

但是我收到此错误(对于每个target_folder名称:

cp: target_folder1 is a directory (not copied).

我究竟做错了什么?

答案1

语法cp类似于

cp src1 src2 src3 ... srcn destdir

这意味着在target_folder{1..11}展开时,前 10 个项目将被视为源名称,只有最后一个项目被视为目录。由于第一个被视为源名称的项目是目录,因此您会收到引用的错误消息。

或者换句话说:您不能cp在单个命令中使用复制到多个目录,不能使用括号扩展,也不能以其他方式使用。

使用循环代替(未经测试):

for d in target_folder{1..11} ; do cp source_folder/source.json "$d" ; done

答案2

我究竟做错了什么?

括号扩展会生成多个参数。cp它不会看到您输入的内容,而是看到 shell 在扩展您输入的内容后提供的内容。cp不支持多个目标,但支持多个源。在您的(扩展的)命令中,只有最后一个参数被解释为目标。除一个参数外,括号扩展产生的其他所有参数都被视为附加源。

target_folder1 is a directory (not copied)意味着target_folder1被解释为源,但它没有被复制,因为除非您使用-R或等效选项,否则目录无法被复制。

要复制到多个目的地,您可以采用以下解决方案这个答案。在您的例子中,有一个文件需要复制,因此它将是这样的:

<source_folder/source.json tee target_folder{1..11}/source.json >/dev/null

注意tee只读取源文件一次。cp最明显的解决方案是循环遍历目标并cp为每个目标调用单独的进程。不过这会多次读取文件。在你的情况下这可能无关紧要,但如果文件很大,那么你肯定不想读取它十一次。

相关内容