Bash - 이름의 날짜를 기준으로 파일을 재구성하는 방법은 무엇입니까?

Bash - 이름의 날짜를 기준으로 파일을 재구성하는 방법은 무엇입니까?

이름에 2001-01-01부터 2020-12-31까지의 연속 날짜가 포함된 수천 개의 파일을 처리하고 있습니다.

이러한 파일의 예는 다음과 같습니다.

gpm_original_20010101.nc
gpm_cressman_20010101_cor_method-add_fac-0.5_pass-1_radius-500km.nc
gpm_cressman_20010101_cor_method-add_fac-0.5_pass-2_radius-250km.nc
gpm_cressman_20010101_cor_method-add_fac-0.5_pass-3_radius-150km.nc
gpm_cressman_20010101_cor_method-add_fac-0.5_pass-4_radius-75km.nc
gpm_cressman_20010101_cor_method-add_fac-0.5_pass-5_radius-30km.nc
.
.
.
gpm_original_20010131.nc
gpm_cressman_20010131_cor_method-add_fac-0.5_pass-1_radius-500km.nc
gpm_cressman_20010131_cor_method-add_fac-0.5_pass-2_radius-250km.nc
gpm_cressman_20010131_cor_method-add_fac-0.5_pass-3_radius-150km.nc
gpm_cressman_20010131_cor_method-add_fac-0.5_pass-4_radius-75km.nc
gpm_cressman_20010131_cor_method-add_fac-0.5_pass-5_radius-30km.nc

등등 2020-12-31. 내가 해야 할 일은 이 파일들을 연도와 월을 기준으로 새 폴더로 재구성하는 것뿐입니다.

디렉터리 트리는 아래와 같이 year하위 디렉터리의 논리를 따라야 합니다.months

2001
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12

2002
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12

등. 그리고 파일 이름에 해당하는 날짜를 기준으로 파일을 이러한 디렉터리로 이동해야 합니다. 예를 들어, 200101xx이름에 포함된 모든 파일을 이 2001/01폴더로 이동해야 합니다.

bash를 사용하여 이를 달성하는 가장 간단한 방법은 무엇입니까?

답변1

내가 올바르게 이해했다면 이것이 내 제안입니다.

for i in *.nc; do 
  [[ "$i" =~ _([0-9]{8})[_.] ]] && d="${BASH_REMATCH[1]}"
  mkdir -p "${d:0:4}/${d:4:2}"
  mv "$i" "${d:0:4}/${d:4:2}"
done

답변2

연도 및 월을 반복합니다.

#!/bin/bash

for year in {2001..2020} ; do
  mkdir $year
  for month in {01..12} ; do
    mkdir $year/$month
    mv gpm_cressman_${year}${month}* $year/$month
  done
done

연도 및 월별로 이름이 긴 파일이 너무 많으면("천 개"라고 주장함) bash한도에 도달할 수 있습니다("매개변수 목록이 너무 김"). 누구나일시적으로 ulimit 증가또는 다음을 사용하십시오 xargs.

#!/bin/bash

for year in {2001..2020} ; do
  mkdir $year
  for month in {01..12} ; do
    mkdir $year/$month
    find -maxdepth 1 -type f -name "gpm_cressman_${year}${month}*" |
      xargs -I '{}' mv '{}' $year/$month
  done
done

답변3

날짜가 파일 이름에서 항상 같은 위치에 있다고 가정하고 다음을 스크립트에 넣으세요.

#!/bin/bash
#
while $# -gt 0 ; do
    file="$1"
    shift
    year="$( echo "$file" | cut -c 14-17)"
    mnth="$( echo "$file" | cut -c 18-19)"
    [[ -d $year/$mnth ]] || mkdir -p $year/$mnth
    echo mv "$file" $year/$mnth
done

다음을 사용하여 스크립트를 호출합니다.

find . -maxdepth 1 -type f -name '*201*' -printf | \
    xargs -r the_script

읽다 man bash find xargs mkdir mv.

echo정말 하고 싶을 때 삭제하세요.

관련 정보