复制合并多个文件夹内容,优先考虑较新的文件

复制合并多个文件夹内容,优先考虑较新的文件

我有几个像这样的文件夹及其内容

data/
-2011/
---images/
------logo.jpg
------banner.jpg
---reports/
------monthly.pdf

-2012/
---images/
------logo.jpg
---reports/
------monthly.pdf
------yearly.pdf

-2013/
---images/
---reports/
------yearly.pdf

-2014/
---images/
------logo.jpg
---reports/
------yearly.pdf

我想对所有文件进行合并和排序,优先考虑新文件而不是旧文件,如果不存在新文件则使用旧版本,并删除年份文件夹。

我正在努力得到这个结果,更喜欢成为一个单线

data
---images/
------logo.jpg      (2014 version)
------banner.jpg    (2011 version)
---reports/
------monthly.pdf   (2012 version)
------yearly.pdf    (2014 version)

编辑:

谢谢杰夫,这完全按照我想要的方式工作,但是我如何在父文件夹名称略有不同的情况下做同样的事情,将文件夹优先考虑为数字而不是日期?

就像是

$ ls -1v

0-6681c0254979c686962dc9
1-d2ed427d79143b923bfe
2-c52049453e80f3a1e9b6
3-b2d885e0115202d0e36d858c9b7d
4-d6d9bb862794c08d325f
5-009cbde4ddbbd23a3da1
6-c35ed13e6aa9ed066330b
7-2f46a484da2cfeab616afb
8-e23a8f406ca869b4dfeb98
9-5150fa1b9721ec7
10-4ba9db442af3ac9163bd4
11-a4dd9a37f613bb0bbb1c5
12-996d279d3bb6b8c73b2416

代替

$ ls -1v

2011
2012
2013
2014

答案1

如果您不关心暴力复制每个文件,这里有一个简单的版本。它循环遍历目录(假设四位数年份,如您的示例所示),自然地按数字顺序对它们进行排序,并将其内容复制到当前目录:

for date in [[:digit:]][[:digit:]][[:digit:]][[:digit:]]/; do cp -r "$date"/* .; done

分成多行:

for date in [[:digit:]][[:digit:]][[:digit:]][[:digit:]]/
do 
  cp -r "$date"/* .
done

如果您在顶级目录(直接在年份下)中有点文件,那么您需要shopt -s dotglob提前。

这会复制每个文件,允许“较新”(后来的文件)文件破坏较旧的文件。


如果您的目录名称不同,则需要不同的通配符/通配符模式。对于非零填充的数字前缀,我建议:

for directory in ?-* ??-* ???-* ... etc ...

捕获最高数字前缀所需的数量。排序在两个地方完成:

  1. 基于位置:在循环中首先列出单位数目录名称for,然后列出两位数名称,依此类推...
  2. 在每个通配符模式中,目录名称按词法排序,因此10-etc将出现在 之前11-etc,依此类推。

相关内容