我有一个文件要复制到大约300,000个不同的目录中,这些文件本身位于两个目录中,例如
DirA/Dir001/
...
DirB/Dir149000/
但是,当我尝试:
cp file.txt */*
它返回:
bash: /bin/cp: Argument list too long
当您使用cp太多时,将文件复制到多个目录的最佳方法是什么?
答案 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元字符的文件名),但这也许是一个单独问题的主题。