정규식을 사용하여 파일 이름을 일괄적으로 바꾸는 방법 [닫기]

정규식을 사용하여 파일 이름을 일괄적으로 바꾸는 방법 [닫기]

내 디렉토리에 파일이 포함된 폴더가 많이 있습니다. 대부분의 파일 이름에는 지역 코드(retropie)가 있으며 클리너는 단일 문자 지역 코드(u, j, e 등)가 있는 ROM을 일치시키지 않습니다. 지역코드를 모두 제거해야 합니다. 지역 코드는 모두 괄호 " (...)"로 묶여 있습니다. 모든 괄호와 그 사이의 텍스트를 제거하는 방법이 있습니까?

예를 들어:

파일 제목은

~/RetroPie/roms/<system>/

ROM의 이름을 다음과 같이 바꾸고 싶습니다.

Super Mario Bros (J).nes  
Super Random game (J,U,E).nes  

도착하다

Super Mario Bros.nes  
Super Random game.nes

이것이 [pause] 태그 문제가 해결되기를 바랍니다.

답변1

find . -iname '*.nes' | xargs -I {} rename -n 's/ *\(.*\)//g' "{}"

출력이 양호해 보이는지 확인한 후 -n 없이 다시 실행하여 변경 사항을 적용합니다.

답변2

rename가능한 경우 Perl 유틸리티를 사용하십시오.

find . -type f -name '* (*)*' -exec rename 's/ \([^)]*\)//g' {} +

이것은 이름에 일치하는 대괄호 세트가 하나 이상 있는 현재 디렉토리 안이나 아래의 모든 일반 파일을 찾습니다. 이러한 파일 배치의 경우 여는 rename괄호 앞의 공백을 포함하여 우리가 알고 있는 괄호를 제거하여 파일 이름을 바꾸는 데 사용됩니다.

아직 안 했다면 rename...

현재 디렉터리 또는 다음 디렉터리에 있는 모든 일반 파일 이름에서 모든 대괄호를 제거하려면 find다음 명령을 사용할 수 있습니다.

find . -type f -name '* (*)*' -exec bash -O extglob -c '
    for pathname do
        filename=${pathname##*/}
        mv -i "$pathname" "${pathname%/*}/${filename// (!(*\)*))}"
    done' bash {} +

파일 이름에 괄호가 있는 모든 일반 파일을 찾습니다. 이러한 파일 배치의 경우 bash짧은 스크립트가 호출됩니다.

스크립트 bash는 발견된 경로 이름의 현재 배치를 반복하고 각 경로 이름에 대해 먼저 경로 이름의 파일 이름 부분을 추출한 다음 대괄호와 해당 내용을 제거하여 파일 이름을 바꿉니다.

코드에는 세 가지 매개변수 대체가 사용됩니다. 그들은

  1. ${pathname##*/}: 경로명에서 디렉터리 경로를 제거하고 파일명만 남깁니다. 이 경우 와 같습니다 $(basename "$pathaname").

  2. ${pathname%/*}: 경로 이름에서 파일 이름을 제거하고 디렉터리 경로를 유지합니다. 이 경우 와 같습니다 $(dirname "$pathname").

  3. ${filename// (!(*\)*))}": 이는 bash값에서 공백과 대괄호를 제거하는 특정 대체 입니다 $filename. subpattern은 를 !(*\)*)포함하지 않는 모든 항목과 일치하는 확장된 와일드카드 패턴입니다 . 이를 사용하여 와 )같은 파일 이름이 .0 (1) 2 (3)0 20

괄호가 여러 개인 경우 위에 표시된 대로 모두 제거됩니다.

자신이 없다고 확신한다면목차이와 같은 괄호를 사용하면 더 짧은 명령을 사용할 수 있습니다.

find . -type f -name '* (*)*' -exec bash -O extglob -c '
    for pathname do
        mv -i "$pathname" "${pathname// (!(*\)*))}"
    done' bash {} +

첫 번째 명령을 테스트합니다.

$ ls -l
total 0
-rw-r--r--  1 kk  wheel  0 Mar  6 18:21 Super Mario Bros (J).nes
-rw-r--r--  1 kk  wheel  0 Mar  6 18:21 Super Random game (J,U,E).nes
$ find . -type f -name '* (*)*' -exec prename 's/ \([^)]*\)//g' {} +
$ ls -l
total 0
-rw-r--r--  1 kk  wheel  0 Mar  6 18:21 Super Mario Bros.nes
-rw-r--r--  1 kk  wheel  0 Mar  6 18:21 Super Random game.nes

다른 명령도 동일한 결과를 제공합니다.

관련 정보