파일 이름을 기준으로 디렉토리의 파일 정렬

파일 이름을 기준으로 디렉토리의 파일 정렬

나는 과학 아카이브 디렉토리에서 35,000개 이상의 양성 진단을 검색했습니다. (다행히도 파일 이름의 형식은 상당히 균일합니다: {year}-{place}-{film-#}-{photo-#} OR {year}-{year}-{place}-{film-#}-{photo-#}.)

OR로 이름을 지정하여 regex디렉토리 를 만들고 해당 사진을 이 디렉토리로 이동하고 싶습니다.awk{year}-{place}{year}-{year}-{place}

이 게시물이 매우 유사한 문제를 다루고 있다는 것을 알고 있지만 "이전"할 수는 없습니다.

몇 가지 문제가 있지만 가장 큰 문제는 정규식이 작동하도록 할 수 없다는 것입니다(비록 정규식은 잘 작동 하고 별 regex101.com문제 가 없지만 ). 작동하게 할 수 있더라도 다른 정규식 그룹은 지원되지 않는 것 같습니다.(|)awk

어떤 도움이라도 대단히 감사하겠습니다 =)

내 정규식 문제를 보여주는 작동하지 않는 예:

#!/bin/bash

regex='\([0-9]*-[0-9]*\|[0-9]*\)-[a-zA-Z]*'
liste='1975-Bali.jpg'
echo $liste
[[$liste=~$regex]]

echo "${BASH_REMATCH[0]}"
echo "${BASH_REMATCH[1]}"

다음을 제공합니다:

1975-Bali.jpg
./ALT_ordner_erstellen.sh: line 8: [[1975-Bali.jpg=~\([0-9]*-[0-9]*\|[0-9]*\)-[a-zA-Z]*]]: command not found

편집하다:

Paul_Pedant가 댓글을 달았듯이: 의사 코드로 표현된 스크립트 구조에 대한 내 생각은 다음과 같습니다.

loop begin
    # via awk or sed?
    for every filename 
         mkdir based on {year}-{place} or {year}-{year}-place
         mv corresponding files to directory
loop end

mkdir은 기존 디렉토리를 생성하지 않도록 선택할 수 있습니다. 그렇죠? 그렇지 않으면 많은 사진을 하나의 디렉토리에 배치해야 하고 이를 다시 만들 때마다 이동된 사진을 잃게 되기 때문에 모든 것을 루프로 수행한다는 위의 아이디어는 그다지 현명하지 않습니다. 그렇죠?

파일 이름 예:

1980-1981-Bali-055-21a.jpg  
1980-1981-Bali-055-21.jpg  
1980-1981-Bali-055a-21.jpg  
1980-Bali-055-21.jpg  
1980-Bali-055a-21.jpg

그리고 "년-년-장소-영화-사진"과 "년-장소-영화-사진"이 분명 있을 수 있기 때문에 처음부터 파일명을 검색하지 않을 생각도 했지만, 마지막부터 다음 스니펫을 참조하세요. :

echo "1980-Bali-055a-028.jpg" | sed -e "s/-[0-9a-zA-Z]*-[0-9]*.jpg$//"

하지만 film-photo.jpg가 항상 파일 이름의 끝(!)인지 100% 확신할 수는 없고 파일 이름도 많고 포지티브를 스캔하지 않았습니다.

귀하의 의견에 감사드립니다!

답변1

그리고 zsh:

zmodload zsh/files
autoload -Uz zmv
mkmv() { mkdir -p -- "$2:h" && mv -- "$@"; }
zmv -n -P mkmv '(<1600-2020>(-<1600-2020>|)-[^0-9-][^-]#)*(#q.)' '$1/$f'

원하는 효과가 만족스러우면 제거합니다 -n(테스트 실행).

( 이름을 바꿀 수 있는 파일이 수천 개 있으므로 속도를 높이기 위해 zmodload zsh/filesmake mkdir및 내장되어 있으며 이는 및 에 대한 호출이 동일하게 많다는 것을 의미합니다 ).mvmkdirmv

관련 정보