我有几个像这样的文件夹及其内容
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 ...
捕获最高数字前缀所需的数量。排序在两个地方完成:
- 基于位置:在循环中首先列出单位数目录名称
for
,然后列出两位数名称,依此类推... - 在每个通配符模式中,目录名称按词法排序,因此
10-etc
将出现在 之前11-etc
,依此类推。