>

저는 수천 개의 하위 디렉토리와 그 안에 파일이있는 수백 개의 폴더가 있습니다. 파일 이름은 현재 형식입니다

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

    여기서 가장 쉬운 도구는 멋진 글로브와 zmv 를 가진 zsh (bash와 같을뿐입니다)  함수. 파일 이름을 바꾸려는 최상위 디렉토리에서이를 실행하십시오.

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

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

    <시간>

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

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

  • 답변 # 2

    코드는 다음과 같습니다 (기본 디렉토리로 디렉토리를 바꾸거나 하위 디렉토리가있는 위치) :

    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"를 제거하지 말고 먼저 테스트하십시오.

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

  • 답변 # 3

    {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를 사용하여 제거하는 방법을 알 수 있습니다.

  • 답변 # 4

    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 로 변경하십시오.  파일이 처리되는 것을 볼 수 있습니다.

  • 이전 bash - 따옴표가 포함 된 파일을 처리하는 방법은 무엇입니까?
  • 다음 mail command - 가상 설정을 사용한 접미사 전달