여러 폴더의 내용을 복사하고 병합하여 최신 파일에 우선순위를 부여합니다.

여러 폴더의 내용을 복사하고 병합하여 최신 파일에 우선순위를 부여합니다.

이와 같은 폴더와 해당 내용이 여러 개 있습니다.

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)

편집하다:

Jeff에게 감사합니다. 이것은 제가 원하는 방식으로 정확히 작동하지만 약간 다른 상위 폴더 이름으로 동일한 작업을 수행하여 폴더의 우선순위를 날짜가 아닌 숫자로 지정하려면 어떻게 해야 합니까?

그것은 마치

$ 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앞으로 살펴봐야 합니다.

이렇게 하면 각 파일이 복사되어 "최신"(이후) 파일이 이전 파일을 손상시킬 수 있습니다.


디렉터리 이름이 다른 경우에는 다른 와일드카드/와일드카드 패턴이 필요합니다. 0이 아닌 숫자 접두어의 경우 다음을 권장합니다.

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

가장 높은 숫자 접두사에 필요한 숫자를 캡처합니다. 정렬은 두 곳에서 수행됩니다.

  1. 위치 기반: 루프에서 먼저 한 자리 디렉터리 이름을 나열한 for다음 두 자리 이름 등을 나열합니다.
  2. 각 와일드카드 패턴 내에서 디렉터리 이름은 사전순으로 정렬되므로 10-etc앞에 표시됩니다 11-etc.

관련 정보