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}"' {} \;