将文件复制到bash中的多个目录中

时间:2018-07-04 13:51:25

标签: bash

我有一个文件要复制到大约300,000个不同的目录中,这些文件本身位于两个目录中,例如

DirA/Dir001/
...
DirB/Dir149000/

但是,当我尝试:

 cp file.txt */*

它返回:

bash: /bin/cp: Argument list too long

当您使用cp太多时,将文件复制到多个目录的最佳方法是什么?

2 个答案:

答案 0 :(得分:3)

该问题的答案为find

find . -mindepth 2 -maxdepth 2 -type d -exec cp script.py {} \;

但是@triplee当然是对的...为什么要复制这么多文件?

可以,当然,可以创建链接到文件...

find . -mindepth 2 -maxdepth 2 -type d -exec ln script.py {} \;

选项-mindepth 2 -maxdepth 2仅将find的递归搜索限制在距当前目录(.)深两层的精确元素中。 -type d与所有目录匹配。 -exec然后对找到的每个元素执行命令(直到结束\;),用元素名称(深两级的子目录)替换{}。 / p>

创建的链接是硬链接。这意味着,您在一个位置编辑脚本,该脚本在 all 位置看起来会有所不同。出于所有意图和目的,该脚本在所有地方都是 ,没有一个比其他地方更“真实”。 (对于不习惯此概念的人可能会感到惊讶。)如果您想创建“软”链接,请使用ln -s,这些链接在原始文档中仅引用“一个真实的” script.py位置。

find ... -exec ... {}与许多其他方式相反,它的优点在于,即使其中包含“有趣”字符的文件名(包括但不限于空格或换行符),它也可以正常工作。

>

但是仍然,您实际上只需要一个脚本。您应该在每个目录中修复需要脚本的项目部分; 是损坏的部分...

答案 1 :(得分:2)

从答案your other question推算出,您似乎拥有看起来像这样的代码

for TGZ in $(find . -name "file.tar.gz")
do
    mkdir -p work
    cd work
    tar xzf $TGZ
    python script.py
    cd ..
    rm -rf work
done

当然,简单的修复方法是替换

python script.py

使用

python ../script.py

当然,您不再需要每个目录中的脚本副本。

我希望进一步建议重构cd并更改script.py,以便您可以将目录传递给它,以作为命令行参数进行操作。 (简而言之,import sys并检查sys.argv[1]的值,尽管您经常会希望进行选项解析并支持多个参数; Python标准库中的argparse有点令人生畏,但是是click之类的友好第三方包装。)

顺便说一句,许多初学者似乎认为可执行文件在执行时将成为工作目录。显然不是这样。或/bin/ls只会列出/bin中的文件。

要摆脱评论中提到的cd问题,一个最小的解决方法是

for tgz in $(find . -name "file.tar.gz")
do
    mkdir -p work
    tar -C work -x -z -f "$tgz"
    (cd work; python ../script.py)
    rm -rf work
done

同样,如果您可以更改Python脚本以使其在当前目录中不需要其输入文件,则可以进一步简化此操作。还请注意变量的首字母缩写为小写,并在包含文件名的变量周围使用引号。在命令替换中使用find仍然有些破绽(它不适用于包含空格或shell元字符的文件名),但这也许是一个单独问题的主题。