파일 이름을 수정하는 Bash 스크립트

파일 이름을 수정하는 Bash 스크립트

수천 개의 하위 디렉터리와 파일이 포함된 수백 개의 폴더가 있습니다. 파일 이름은 현재 형식입니다.

sf{number}-{number} - {text}

그리고 {text}까지 모든 것을 삭제해야 합니다.

예:

sf012-05 - toto - africa.cdg 
sf012-05 - toto - africa.mp3

->

toto - africa.cdg
toto - africa.mp3

추가 형식:

SF-108 - 02 Johnny Hates Jazz Shattered Dreams[K].cdg
02 - David Essex - Rock On.cdg
SF0504 - 13 Walker Brothers, The  Make It Easy On Yourself.cdg
SFLY 051 - 07 America  A Horse With No Name.cdg
SF217-12 this love - maroon 5.cdg
SF262-13. Same Mistake - James Blunt.cdg
SF287 - 13 Luke Bryan Do I.cdg
SF355-01-15 - Tough Love - Pony.cdg
Track 11 Livin' La Vida Loca (Radio Edit) - Martin, Ricky.cdg
Sunfly Hits 275 - 07 SF275-7-Right Now (Na Na Na)-Akon.mp3
Second, Minute Or Hour - Jack Penate.mp3
SF057 - Karaoke Classics Vol.57 - 03 Abba Thank You For The Music.cdg

특히 마지막은 완전 쓰레기네요.

즉, 이러한 파일을 살펴보고 이름을 바꾸려면 재귀 정규식 bash 스크립트나 이와 유사한 것이 필요하다는 의미입니다.

답변1

Perl 기반 rename유틸리티( prename일부 배포판에서 호출됨)가 있는 경우 정규식을 사용하여 모든 파일의 이름을 한 번에 바꿀 수 있습니다.

귀하의 요구 사항은 제거를 요청 sf{number}-{number}하지만 모든 예제는 대문자로 시작하고 일부에는 {number}, {number}-{number}-{number}또는 심지어 하나만 포함되어 있습니다 {number}{space}-{space}{number}. 나는 당신이 이 사례들 중 처음 두 가지를 포함하기를 원한다고 가정할 것입니다.

rename -n 's/^sf[0-9-]+\s+(-\s+)?//' [Ss][Ff]*

-n변경 사항을 적용할 준비가 되면 을 제거 하거나 로 변경하여 -v진행되는 파일 처리를 확인하세요.

답변2

여기서 가장 쉬운 도구는 다음과 같습니다.zsh(bash와 마찬가지로 더 좋습니다)멋진 글로빙그리고zmv기능. 파일 이름을 바꾸려는 최상위 디렉토리에서 이것을 실행하십시오.

autoload -U zmv
zmv '(**/)[Ss][Ff][0-9]##-[0-9]##[- ]#(*)' '$1$2'

설명: **/선행 디렉토리의 문자열입니다. 그런 다음 (대소문자를 구분하지 않음) 패턴과 sf하나 이상의 숫자, 대시 및 다른 숫자, 대시 및 공백이 뒤따릅니다. 마지막으로 접미사가 있을 수 있습니다 *. 대체된 숫자는 패턴에서 괄호 안에 있는 그룹을 나타냅니다.


또는 prenameDebian 및 Arch Linux에서 사용할 수 있는 Perl 기반 이름 바꾸기 스크립트를 다른 배포판에 별도로 설치해야 할 수도 있습니다. find이름을 바꿀 파일 목록을 수집하려면 와 결합해야 합니다 . 일치하지 않는 파일이 전달 되더라도 상관 없으며 rename이름을 변경할 수 없는 파일은 건너뜁니다.

find -name '[Ss][Ff]*' -exec prename 's!/!sf[0-9]+-[0-9]+[- ]*!!i' {} +

답변3

코드는 다음과 같습니다(디렉터리를 기본 디렉터리 또는 하위 디렉터리가 있는 위치로 바꾸세요).

cd directory
find -type f | while IFS= read - file; do 
    name=$(echo "$file"  | rev | cut -d'/' -f1 | rev |  cut -d'-' -f3- | cut -d' ' -f2-) 
    path=$(dirname "$file")  
    newname="${path}/${name}"
    echo mv "$file" "$newname" 
done

여기서 디렉토리는 모든 하위 디렉토리가 있는 기본 디렉토리입니다....

"mv"에서 "echo"를 제거하지 말고 먼저 테스트해 보십시오.

잘못된 디렉토리에서 실행하지 않도록 주의하세요. 매우 위험할 수 있습니다.

답변4

당신은 당신을 말한다{text}까지 모든 것을 삭제해야 합니다, 그러나 귀하의 예는 그것을 보여주지 않습니다. 정확한 코드를 보여주기보다는 그냥 계획을 제시해보겠습니다.

1) 원하는 것을 수행하는 스크립트 작성하나파일 이름. 다음과 같은 작업을 수행할 수 있습니다.

#! /bin/sh
test -d ~/OK/${PWD} || mkdir -p ~/OK/${PWD}
ln "$1" "~/OK/${PWD}/$1"
echo "$1" | awk -F ' - ' '{print $NF}'

그러면 ' - ' 패턴의 이름이 끊어지고 마지막 필드가 인쇄됩니다. 그리고 문제가 발생할 경우 검색할 수 있도록 원본 파일 이름을 저장합니다. 몇 번 테스트한 후 mv이름을 복원하는 데 사용하세요.

2) 다음을 사용하여 스크립트를 호출합니다.찾다:

$ find dirname -exec script.awk {} +

그러면 스크립트를 여러 번 병렬로 호출하여 컴퓨터가 땅에 묻힐 것입니다. 완료되면 제거할 OK 디렉터리가 많이 생기고 find를 사용하여 제거하는 방법을 알게 됩니다.

관련 정보