이름이 YYYYMMDD 인 폴더 이름을 연, 월, 일의 폴더 계층으로 바꾸는 방법은 무엇입니까?


8

이름에 날짜가있는 폴더 목록이 있습니다. 날짜는 YYYYMMDD 형식입니다 (예 : 20150129). 이 폴더에는 특정 날짜와 관련된 텍스트 문서가 있습니다.

연도별로 월 단위로 폴더 계층 구조로 구조를 재구성하고 텍스트 문서를 계층 구조에서 아래로 해당 '날짜'폴더로 이동하고 싶습니다.

즉, 'root'폴더의 이름을 2015와 같이 연도에 따라 지정한 다음 01과 같은 개월로 이름이 지정된 하위 폴더를 만들고 날짜가 29로 지정된 하위 폴더를 작성하여 해당 텍스트 문서를 보유하고 싶습니다. .

따라서 경로는 2015/01/29/file.txt또는 처럼 보입니다 2015>01>29>file.txt.

Automator를 살펴본 결과 잘못 될 수는 있지만 이와 같은 것은 불가능한 것 같습니다. 그래서 알고 싶습니다 ...

  1. 평신도가 예를 들어 Automator 워크 플로와 같이 이해할 수있는이 문제에 대한 쉬운 해결책이 있습니까, 아니면 터미널 명령과 정규 표현식에 대한 이해가 필요합니까?

  2. 실제로 해결책이 있다면 어떻게이 문제를 해결할 것입니까?


이 질문을 "너무 광범위"하다고 결론을 내린 사람은 누구입니까? 이 질문에 대해 "너무 광범위"한 것이 궁금합니다.
user3439894

이 YYYYMMDD 폴더는 모두 하나의 마스터 폴더 안에 직접 있습니까? 아니면 더 넓은 계층에 분산되어 있습니까?
nohillside

내 경우에는 @patrix 그들은 같은 디렉토리 또는 마스터 폴더에 모두
davidjnatarajan

답변:


8

이 모든 YYYYMMDD 폴더가 실행할 수있는 동일한 상위 디렉토리의 일부라고 가정하십시오.

cd PARENT_DIRECTORY
for d in */; do
    [[ $d =~ [0-9]{8}/ ]] || continue
    mkdir -p -- "${d:0:4}/${d:4:2}"
    mv -- "$d" "${d:0:4}/${d:4:2}/${d:6:2}"
done
  • for d in */; do루프가 모든 디렉토리 항목을 읽고, 후행 /보장하지만 단지 디렉토리 이름은 실제로 일치하는지
  • [[ $d =~ [0-9]{8}/ ]] 현재 항목이 8 자리로 구성되어 있는지 테스트하고 그렇지 않은 경우 다음 항목으로 계속합니다.
  • ${d:0:4}/${d:4:2}/${d:6:2}내부 bash에 매개 변수 확장 을 사용하여 새 경로를 포함하는 문자열을 만듭니다.
  • --모두 mkdirmv경우에 방지 문제 A를 디렉토리 나 파일 이름이 시작됩니다 -. 이것은 여기서 일어날 수 없지만 어쨌든 좋은 연습 일 것입니다.

원본 스크립트를 개선하는 방법에 대한 아이디어는 @terdon 및 @ user3439894에게 감사합니다.


답변 주셔서 감사합니다, 이것은 완벽하게 작동합니다! 이 솔루션이 @grgarside가 제공하는 솔루션보다 낫다고 생각합니다. 특히 수천 개의 텍스트 문서를 포함하여 방대한 자료를 처리 할 때 훨씬 빠르기 때문입니다.
davidjnatarajan

8

터미널에서 다음을 사용할 수 있습니다. cd포함 폴더로 이동 한 후 다음을 실행하십시오.

find . -type f -exec bash -c \
  'F=$(sed -E "s#^\./([0-9]{4})([0-9]{2})([0-9]{2})#\1/\2/\3#" <<< $1);\
  mkdir -p -- $(dirname "$F");\
  mv -- "$1" "$F"' - {} \;

find . -type f현재 디렉토리의 모든 파일을 재귀 적으로 얻습니다.
-exec bash -c쉘을 열어 다음 명령을 실행합니다.
F=$(…)서브 쉘을 열고 파일 경로에서 sed를 사용하여 폴더 경로를 조작합니다.
^\./([0-9]{4})([0-9]{2})([0-9]{2})는 다음과 같이 3 개의 캡처 그룹이있는 정규식입니다 . 각 캡처 그룹 ( 등) 이로 대체되는 대체 입니다. 파일을 이동할 디렉토리를 만듭니다. 각 파일을 해당 폴더로 이동합니다.
\1/\2/\3\1/
mkdir -p -- $(dirname "$F")
mv -- "$1" "$F"

왼쪽의 계층 구조를 가져와 오른쪽의 계층 구조로 변환합니다.

├── 20170201               └── 2017
   └── abcdefghij             ├── 02
└── 20170302                      └── 01
    └── abcdefghij 2                  └── abcdefghij
                               └── 03
                                   └── 02
                                       └── abcdefghij 2

포함 폴더에 날짜가 날짜 인 다른 파일이 있으면 파일이 폴더 인 것처럼 이동합니다. 이를 방지하려면 두 번째 줄을 다음으로 바꾸십시오.

  'F=$(sed -E "s#^\./([0-9]{4})([0-9]{2})([0-9]{2})(?:/.+)#\1/\2/\3#" <<< $1);\

따라서 (?:/.+)경로에 후속 구성 요소가 있으므로 부모 디렉토리에 파일이없는 자식이없는 항목은 무시합니다.


@klanomath regex101.com
grg

@grgarside Thanx
klanomath
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.