이름에 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
정말 하고 싶을 때 삭제하세요.