
수천 개의 하위 디렉터리와 파일이 포함된 수백 개의 폴더가 있습니다. 파일 이름의 현재 형식은 다음과 같습니다.
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
여기서 가장 간단한 도구는 다음과 같습니다.다루기 힘든(bash와 마찬가지로 더 좋습니다) 그리고멋진 와일드카드그리고zmv
기능. 이름을 바꾸려는 파일의 최상위 디렉터리에서 이 명령을 실행하세요.
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' {} +
답변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 {} +
이로 인해 많은 스크립트에 대한 병렬 호출이 컴퓨터에 넘쳐나게 됩니다. 작업이 끝나면 삭제할 수 있는 디렉터리가 많이 생기며, find를 사용하여 해당 디렉터리를 삭제하는 방법을 알게 됩니다.