Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Bash one命令行中,将名称不正确的文件从一个深度嵌套的目录(内容地址为重命名)复制到另一个扁平子目录?_Bash_Md5_Uuid_Xargs_Gnu Parallel - Fatal编程技术网

在Bash one命令行中,将名称不正确的文件从一个深度嵌套的目录(内容地址为重命名)复制到另一个扁平子目录?

在Bash one命令行中,将名称不正确的文件从一个深度嵌套的目录(内容地址为重命名)复制到另一个扁平子目录?,bash,md5,uuid,xargs,gnu-parallel,Bash,Md5,Uuid,Xargs,Gnu Parallel,如何将分布在深度嵌套子目录中的文件复制到另一个完全没有嵌套的子目录(即,是平面的)?为了提高难度,我有这些限制/皱纹 虽然源文件具有相同的扩展名(*.xlsx),但它们的文件名中有空格 源子目录及其所有内容都是只读的 因为潜在的名称冲突,因为糟糕的文件名,因为我有一群这样的文件,它们的原始名称对我来说是无用的,我想以某种方式解决它们 脚本环境是Bash 由于其他限制,在一行中执行此操作非常重要 为了简单起见,需要额外强调,因为越是深奥,我的同事们就越不可能去探究这个问题 我尝试了cp,find,

如何将分布在深度嵌套子目录中的文件复制到另一个完全没有嵌套的子目录(即,是平面的)?为了提高难度,我有这些限制/皱纹

  • 虽然源文件具有相同的扩展名(*.xlsx),但它们的文件名中有空格
  • 源子目录及其所有内容都是只读的
  • 因为潜在的名称冲突,因为糟糕的文件名,因为我有一群这样的文件,它们的原始名称对我来说是无用的,我想以某种方式解决它们
  • 脚本环境是Bash
  • 由于其他限制,在一行中执行此操作非常重要
  • 为了简单起见,需要额外强调,因为越是深奥,我的同事们就越不可能去探究这个问题
  • 我尝试了
    cp
    find
    xargs
    parallel
    uuidgen
    md5sum
    ,Bash循环,以及它们的各种组合,但效果有限。我所能达到的最好效果就是为每个文件生成一个随机UUID。我想这没关系,但这并不完全是我想要的“内容寻址”,因为我想根据文件的内容消除重复

    作为参考,它看起来像这样,其中
    source
    dest
    是源和目标子目录

    find source/* -type f -exec sh -c 'for f; do cp "$f" 'dest'/"$(uuidgen)"; done' Renamer {} +
    
    虽然UUID很好,但我并不一心想要它们,我愿意接受其他想法,将上述约束模块化


    谢谢

    使用命令
    md5sum
    计算文件内容的
    md5sum

    find*-type f-exec sh-c'表示f;do cp“$f”'dest'/$(md5sum“$f”| sed-es/[:space:][]./]);完成'{}+
    
    这使用了
    sed
    来调整
    md5sum
    的输出,使其不包含文件名,而不是通常的
    md5sum | awk'{print$1}'
    ,这样我就不必考虑转义引号了


    当然,您可能会与md5发生哈希冲突,但您可以轻松地将哈希转换为使用
    sha256sum
    或任何您喜欢的方式。

    使用命令
    md5sum
    计算文件内容的
    md5sum

    find*-type f-exec sh-c'表示f;do cp“$f”'dest'/$(md5sum“$f”| sed-es/[:space:][]./]);完成'{}+
    
    这使用了
    sed
    来调整
    md5sum
    的输出,使其不包含文件名,而不是通常的
    md5sum | awk'{print$1}'
    ,这样我就不必考虑转义引号了


    当然,您可能会与md5发生哈希冲突,但您可以轻松地将哈希转换为使用
    sha256sum
    或任何您喜欢的方式。

    如果使用GNU并行,umläute的解决方案会短一点:

    find * -type f -print0 | parallel -0 cp {} dest/'$(md5sum {} | sed -e s/[[:space:]].*//)'
    

    在包含多个连续空格和换行符的文件名上进行测试。

    如果使用GNU Parallel,umläute的解决方案会稍微短一些:

    find * -type f -print0 | parallel -0 cp {} dest/'$(md5sum {} | sed -e s/[[:space:]].*//)'
    

    在包含多个连续空格和换行符的文件名上进行测试。

    在一行中执行此操作非常重要。
    -在shell中,所有内容都是一行-您始终可以删除换行符并用
    替换它们
    find source/*
    等于
    find source
    (不计算隐藏文件)您对“内容寻址”的确切含义是什么?是否要根据其内容命名xlsx文件?内容的哪一部分?@KamilCuk我说过,为了防止有人试图用Bash脚本文件来回答这个问题,@umläute我所说的“内容寻址”是指我希望发生以下事情:如果有两个文件位于嵌套源层次结构的不同部分,但在其他方面具有相同的名称,但内容不同的,就不要互相碰撞。OTOH,如果任何两个文件具有相同的内容,无论它们的名称如何,其中一个文件都应该重击另一个文件。例如,删除重复项。
    在一行中执行此操作很重要。
    -在shell中,所有内容都是一行-您始终可以删除换行符并用
    替换它们
    find source/*
    等于
    find source
    (不计算隐藏文件)您对“内容寻址”的确切含义是什么?是否要根据其内容命名xlsx文件?内容的哪一部分?@KamilCuk我说过,为了防止有人试图用Bash脚本文件来回答这个问题,@umläute我所说的“内容寻址”是指我希望发生以下事情:如果有两个文件位于嵌套源层次结构的不同部分,但在其他方面具有相同的名称,但内容不同的,就不要互相碰撞。OTOH,如果任何两个文件具有相同的内容,无论它们的名称如何,其中一个文件都应该重击另一个文件。也就是说,删除重复项。因为该解决方案被文件名中的空格绊倒了:我没有看视频(请解释错误),而是添加了引号,这可能会纠正问题。@tripleee原始解决方案的错误在于它因文件名中的空格而损坏。但是,通过你的编辑,它是有效的,所以,你赢得了奖品。现在。是否有人想尝试将
    md5sum
    替换为
    uuidgen
    ?还有,“为什么不”我会这样做?因为如果我知道答案,我就不会问这个问题了。因为这个解决方案被文件名中的空格绊倒了:我没有看视频(请解释一下怎么了)但添加了引号,这可能会纠正问题。@tripleee原始解决方案的错误在于,它因文件名中的空格而中断。但是,通过你的编辑,它是有效的,所以,你赢得了奖品。现在。是否有人想尝试将
    md5sum
    替换为
    uuidgen
    ?还有,“为什么不”我会这样做?因为如果我知道答案,我会