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