나는 과학 아카이브 디렉토리에서 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/files
make mkdir
및 내장되어 있으며 이는 및 에 대한 호출이 동일하게 많다는 것을 의미합니다 ).mv
mkdir
mv