이름에 날짜가 포함된 파일을 디렉터리로 이동

이름에 날짜가 포함된 파일을 디렉터리로 이동

cronjobs에서 설정할 수 있는 스크립트를 사용하여 날짜별로 파일을 정렬하는 데 도움이 필요합니다. 디렉토리를 추출하고 생성하려는 문자열은 다음과 같습니다.YYYYMMDDDHMMSS, 모든 파일 이름에 존재합니다.

# ls
AB.CDEFGHIJ0KLM_NO_1234P5678_QR_9012_YYYYMMDDHHMMSS_345678_ETH2_Testing-run_0.msg

즉, ABC.DVCSR1234_20191101120130_BLAH_97.msg의 출처는 다음과 같습니다.

/home/user/files/AB.CDEFGHIJ0KLM_NO_1234P5678_QR_9012_YYYYMMDDHHMMSS_345678_ETH2_Testing-run_0.msg

도착하다

/home/user/files/2019/11/01/AB.CDEFGHIJ0KLM_NO_1234P5678_QR_9012_YYYYMMDDHHMMSS_345678_ETH2_Testing-run_0.msg

파일 구조로 재구성해야 하는 수천 개의 파일이 있습니다.

답변1

이동하려는 파일에 다음 패턴이 포함되어 있다고 가정합니다 _YYYYMMDDHHMMSS_.

#!/bin/bash

cd /home/user/files
for file in *.msg; do
  date=$(printf "$file" | sed -nE 's/.*_([0-9]{4})([01][0-9])([0-3][0-9])[0-2][0-9][0-6][0-9][0-6][0-9]_.*/\1\/\2\/\3/p')
  if [ -n "$date" ]; then
    mkdir -p "$date" && mv "$file" "$date"
  fi
done

답변2

해킹 방법. ls 구문 분석이 나쁘다는 점, 파일 이름의 공백으로 인해 문제가 발생하는 점 등에 대한 일반적인 면책 조항입니다.

폴더를 생성합니다. 모든 달은 31일이라고 가정합니다!

mkdir -p {2017..2019}/{01..12}/{01..31}

무엇을 할 것인지 미리보기

ls ABC* | awk -F_ '{ print "mv",$0,substr($2,0,4)"/"substr($2,5,2)"/"substr($2,7,2)"/"$0}'

실제로 실행하려면 위와 동일한 명령을 사용하되 | sh플래그를 사용하세요.

ls ABC* | awk -F_ '{ print "mv",$0,substr($2,0,4)"/"substr($2,5,2)"/"substr($2,7,2)"/"$0}' | sh

답변3

이 문제를 해결하기 위해 다음을 사용했습니다 find.

find . -type f -name "*.msg" -exec bash -c 'DIRS=$(echo ${0} | cut -d'_' -f2); mkdir -p "${DIRS:0:4}/${DIRS:5:2}/${DIRS:7:2}"; mv "${0}" "${DIRS:0:4}/${DIRS:5:2}/${DIRS:7:2}"' {} \;

관련 정보