Encryption 在过多的文件上运行命令

Encryption 在过多的文件上运行命令,encryption,xargs,concurrent-processing,Encryption,Xargs,Concurrent Processing,我想加密和解密大文件(想想2000万行)的文本。我正在使用的加密服务最多只能加密64kb。出于这个问题的目的,假设我们一直使用这个服务 我的解决方案是将这个巨大的文件分成64kb的块,并行加密所有文件,并将加密的部分放在tar.gz中。每个零件编号为零件xxx,以确保我可以恢复原始文件。在解密时,我解压,并行解密每个部分,并按顺序解密结果 有趣的部分:当我在一个足够大的文件上完成最后一部分时,会发生以下情况之一: tmux会话终止,我注销。没有日志,什么都没有 我明白了: 我尝试了几种基于xar

我想加密和解密大文件(想想2000万行)的文本。我正在使用的加密服务最多只能加密64kb。出于这个问题的目的,假设我们一直使用这个服务

我的解决方案是将这个巨大的文件分成64kb的块,并行加密所有文件,并将加密的部分放在
tar.gz
中。每个零件编号为
零件xxx
,以确保我可以恢复原始文件。在解密时,我解压,并行解密每个部分,并按顺序解密结果

有趣的部分:当我在一个足够大的文件上完成最后一部分时,会发生以下情况之一:

  • tmux会话终止,我注销。没有日志,什么都没有

  • 我明白了:

  • 我尝试了几种基于xargs的解决方案,但没有成功。下面是有趣的代码:

    echo "Decrypting chunks in parallel."
    # -1 -f in ls helped me go from scenario 1 to scenario 2 above. 
    # Makes sense since I don't need sorting at this stage.
    ls -1 -f part-* | xargs -I % -P 32 bash -c "gcloud kms decrypt --ciphertext-file % --plaintext-file ${OUTPUT}.%"
    
    # Best case scenario, we die here
    find $OUTPUT.part-* | xargs cat > $OUTPUT
    rm $OUTPUT.part-*
    
    更有趣的是:当find和rm报告一个问题时,我可以转到temp文件夹中的所有部分,自己运行完全相同的命令,一切正常


    在重要的情况下,所有这些都发生在安装了RAM的文件系统中。但是RAM不可能是问题所在:我在一台拥有256GB RAM的机器上,涉及的文件占用1-2GB,并且
    htop
    从未显示超过10%的使用率。

    您的问题在于:

    ls -1 -f part-* | ...
    find $OUTPUT.part-* | ...
    rm $OUTPUT.part-*
    
    如果您有太多的部分(
    part-*
    ,等等),shell执行的文件名扩展将导致命令包含太多参数,或者您可能会超过最大命令长度

    find
    +
    xargs
    允许您克服这一点。您可以将使用glob列出当前目录中文件的任何命令替换为,例如:

    find . -name GLOB -print -o ! -path . -prune | xargs CMD
    
    -o-路径-prune
    告诉
    find
    不要下降到子目录中
    xargs
    确保生成的命令行不超过最大参数或行限制

    因此,对于这三条线,您可以做到:

    globwrap(){
    glob=“$1”
    转移
    查找。-名称“$glob”-打印-o!-路径。-修剪|\
    sed's/^../'|\
    xargs“$@”#如果未给出命令,则默认为echo
    }
    globwrap“部分-*”|。。。
    全局换行“$OUTPUT”。部分-*”|。。。
    全局换行“$OUTPUT”。部分-*”rm
    
    单引号防止shell扩展我们传递给
    find
    的glob

    sed
    去掉每个文件名前面的
    /


    请注意,在前两种情况下,不再需要原始的
    ls
    find

    您有一台安装了256GB RAM的机器,但将未加密的数据以64kB的数据块通过Internet发送出去以进行加密?加密和解密都发生在具有256GB RAM的同一台机器上。没有通过internet发送任何内容。我不确定我是否理解这一点,但您的
    find
    命令是错误的。您需要
    查找-名称“$OUTPUT.part-*”..
    。。。而不是
    find…|xargs…
    您可能希望
    查找-exec cat{}\;>某些地方
    xargs
    具有与
    cat
    相同的限制,请参见
    sysctl-a | grep-i argmax
    find . -name GLOB -print -o ! -path . -prune | xargs CMD