繁体   English   中英

合并目录树的最快方法

[英]Fastest way to merge a directory tree

我有多个表单目录

foo/bar/baz/alpha_1/beta/gamma/files/uniqueFile1
foo/bar/baz/alpha_2/beta/gamma/files/uniqueFile2
foo/bar/baz/alpha_3/beta/gamma/files/uniqueFile3

将这些目录合并到单个目录结构的最快方法是什么?

foo/bar/baz/alpha/beta/gamma/files/uniqueFile1...uniqueFile3

我可以编写一个python脚本来做到这一点但是有更快的方法在debian机器上做到这一点吗? 在这种情况下rsync可以帮忙吗?

编辑:

对于之前没有说清楚的道歉,示例中的深度是~10-12,我不知道某些目录名称,例如alpha *,这些是在丢弃日志时随机生成的。 我之前使用带有通配符的find来列出这些文件,但现在路径中添加了另一个级别,导致我的查询查询从0.004秒开始花费一分钟。 所以我正在寻找更快的解决方案。

/known_fixed_path_5_levels/*/known_name*/*/fixed_path_2_levels/n_unique_files

已经成为

/known_fixed_path_5_levels/*/known_name*/*/xx*/fixed_path_2_levels/unique_file_1
/known_fixed_path_5_levels/*/known_name*/*/xx*/fixed_path_2_levels/unique_file_2
.
.
/known_fixed_path_5_levels/*/known_name*/*/xx*/fixed_path_2_levels/unique_file_n

我基本上想要将所有这些独特的文件收集到一个地方,就像以前一样。

find

mkdir --parents foo/bar/baz/alpha/beta/gamma/files; #create target directory if nessessary
find foo/bar/baz/alpha_[1-3]/beta/gamma/files -type f -exec cp {} foo/bar/baz/alpha/beta/gamma/files \;

由于问题不清楚复制移动 ,有两种方法, 没有复制! 即便是第二部分也无法有效复制您的数据!

简单的命令

只是:

cd foo/bar/baz
mv -it alpha/beta/gamma/files alpha_*/beta/gamma/files/uniqueFile*

使用-i开关来防止覆盖。

这将适用于小批量文件。

更强大和自适应的语法

或者使用find:

cd foo/bar/baz
find alpha_* -type f -mindepth 3 -exec mv -it alpha/beta/gamma/files {} +

使用find优点是

  • 你可以添加很多标志,如-name-mtime
  • find永远不会尝试将更多文件传递给命令行可以容纳的命令( mv )。

cp -al特定的UN * X概念

在Un * x下,您可以创建硬链接,它不是符号链接,而是文件夹树中的辅助条目,用于相同的inode。

注意:由于只需要引用一个inode,因此这只能在同一个文件系统上运行。

通过使用

cp -ialt alpha/beta/gamma/files alpha_*/beta/gamma/files/uniqueFile*

您将在一个目录中复制所有inode引用,但每个只保留一个文件。

使用globstar功能:

cd foo/bar/baz
shopt -s globstar
cp -alit alpha/beta/gamma/files alpha_*/**/uniqueFile*

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM