合并目录的最快方法

2024-03-28 10:49:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我有多个目录的形式

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*,它们是在抛出日志时随机生成的。我以前使用带有通配符的查找来列出这些文件,但是现在在路径中添加了另一个级别,这导致我的查找查询从0.004s占用了一分钟的时间。因此我正在寻找一个更快的解决方案。你知道吗

/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

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


Tags: pathnamealpha目录foobarfilesbaz
2条回答

使用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开关防止覆盖。你知道吗

这将非常适用于一小堆文件。你知道吗

更健壮和自适应的语法

或者使用查找:

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引用,但每个inode引用只保留一个文件。你知道吗

使用globstar功能:

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

相关问题 更多 >