複数のフォルダの内容をコピーしてマージして、最新のファイルに優先順位を付けます。

複数のフォルダの内容をコピーしてマージして、最新のファイルに優先順位を付けます。

このようなフォルダとその内容は複数あります。

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

すべてのファイルを無差別の代入としてコピーすることに気にしない場合は、ここに簡単なバージョンがあります。例のように、4桁の年を想定してディレクトリを繰り返し、自然に数字順に並べ替え、その内容を現在のディレクトリにコピーします。

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 ...

最も高い数字プレフィックスに必要な数字をキャプチャします。ソートは2箇所で行われます。

  1. 場所ベース:ループ内で最初に1桁のディレクトリ名を一覧表示し、次に2桁の名前などを一覧表示しますfor
  2. 各ワイルドカードパターン内で、ディレクトリ名はアルファベット順にソートされるため、10-etc前に表示されます11-etc

関連情報