如何解决将名称不正确的文件从一个深层嵌套的目录内容地址重命名复制到Bash单行格式的另一个扁平子目录中?
如何将分布在深层嵌套子目录中的文件复制到完全不嵌套(即平坦)的另一个子目录中?为了提高难度,我有这些限制/皱纹。
- 尽管源文件具有相同的扩展名(* .xlsx),但文件名中具有空格。
- 源子目录及其所有内容都是只读的。
- 由于文件名太烂,由于潜在的名称冲突,因为我有这些文件,而且它们的原始名称对我来说毫无用处,所以我想以某种方式对它们进行内容寻址。。 li>
- 脚本环境是Bash。
- 由于其他限制,因此必须一行完成。
- 为简单起见,特别要点是,因为它越深奥,我的同事越不可能理解这一点。
我尝试了cp
,find
,xargs
,parallel
,uuidgen
,md5sum
,Bash for
循环,以及它们的各种组合,但效果有限。我已经能够做到的最好的就是为每个文件生成一个 random UUID。没关系,我想这不是我想要的“内容寻址”,因为我想根据文件的 content 对文件进行重复数据删除。
作为参考,如下所示,其中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 'for f; do cp "$f" 'dest'/$(md5sum "$f" | sed -e s/[[:space:]].*//); done' _ {} +
这使用sed
来按摩md5sum
的输出,使其不包含文件名,而不包含通常的md5sum <file> | awk' {print $1}'
,这样我就不必考虑转义引号了。
当然,您可能会与md5发生哈希冲突,但是您可以轻松地将哈希切换为使用sha256sum
或任何您喜欢的变量。
umläute的解决方案要短一些:
find * -type f -print0 | parallel -0 cp {} dest/'$(md5sum {} | sed -e s/[[:space:]].*//)'
对包含多个连续空格和换行符的文件名进行了测试。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。