대량 이름 변경, * nix 버전


11

* nix (Ubuntu 및 FreeBSD, 별도로)를 사용하고 있다는 점을 제외하고 는 비슷한 이름의 많은 파일 이름을 바꾸는 방법을 찾고있었습니다 (Windows 관련 질문 ). 셸 (Bash, CSH 등)을 사용하는 동안 요약하면 다음과 같은 여러 파일을 어떻게 대량 이름을 바꿉니 까?

베토벤-모피 엘리스 .mp3
베토벤-달빛 소나타 .mp3
베토벤-Ode to Joy.mp3
베토벤-잃어버린 페니의 분노 .mp3

이처럼 이름이 바뀝니 까?

모피 엘리스 .mp3
Moonlight Sonata.mp3
Ode to Joy.mp3
Rage over the Lost Penny.mp3

내가 원하는 이유는 이러한 파일 모음이 "Beethoven"이라는 디렉토리 (예 : 파일 이름 접두사) 아래로 이동하고 파일 이름 자체에 대한 정보가 중복되기 때문입니다.

답변:


12

이름 바꾸기 유틸리티가 원하는 작업을 수행합니다.

그냥 사용 rename 's/Beethoven\ -\ //g' *.mp3


유틸리티에 대한 링크를 제공하도록 편집 할 수 있습니까? 아니면 언급 된 두 배포판 (Ubuntu 및 FreeBSD) 모두에서 표준입니까?
Chris W. Rea

1
펄과 함께 제공됩니다. 데비안은 그것을 rename 명령으로 사용하므로 우분투도 그렇게 생각합니다. 쓸모없는 또 다른 '이름 바꾸기'명령이 있으므로 매뉴얼 페이지를 확인하십시오.
derobert

와우, 이름 바꾸기 구문은 vim replace와 매우 비슷해 보입니다 : D
Dzung Nguyen

/ usr / ports / sysutils / rename의 포트는 FreeBSD에서 완벽하게 작동했습니다
Josh W.

10

Linux / Unix의 많은 것들과 마찬가지로 여러 가지 방법이 있습니다!

일부는 mmv (질량 mv)를 사용할 수 있습니다 .

일부 Perl 패키지 (최신 Ubuntu 및 Debian)와 함께 제공되는 rename 또는 prename 명령도이 작업을 수행 할 수 있습니다.

prename 's/Beethoven\ -\ //g' Beethoven*.mp3

Fedora 10의 이름 바꾸기 도구는이 프로그램과 동일하지 않으며 다르게 작동합니다. 다른 패키지 인 util-linux-ng의 일부이며 여기 에서 찾을 수 있습니다 .

나는 종종 습관에서 벗어나기 위해 쉘로갑니다 (모든 도구가 항상 존재하지는 않았지만).

mkdir -p Beethoven
for x in Beethoven\ -\ *
do
mv "$x" Beethoven/"${x/Beethoven - /}"
done

그러면 Beethoven 디렉토리가 생성되고 파일이 해당 디렉토리 / 파일 이름으로 이동합니다. 여기서 파일 이름은 "Beethoven-"으로 바뀌지 않습니다.

테스트하기 전에 :

$ ls
Beethoven - Fur Elise.mp3                 Beethoven - Ode to Joy.mp3
Beethoven - Moonlight Sonata.mp3          Beethoven - Rage Over the Lost Penny.mp3

후:

$ ls Beethoven/
Fur Elise.mp3                 Ode to Joy.mp3
Moonlight Sonata.mp3          Rage Over the Lost Penny.mp3

4

grep과 rename을 조합하여 구현 된이 솔루션을 사용해보십시오. 이것은 당신이 이름을 바꿔야 할 많은 디렉토리가 있다고 가정합니다. 몇 개만 있으면 수동으로 접근하고 "아티스트-"패턴을 각각 하드 코드했습니다.

# Rename any mp3 files in the directory hierarchy of type "a - b.mp3" to "b.mp3"
find . -name "*.mp3" -exec rename -n -v 's|^(.*/).*-\s*(.*)\s*$|$1$2|g' {} \;

설명 발견은 : 찾기 명령은 모든 파일을 찾아 .MP3의 현재 파일 계층의 확장과에 전달 된 인수 호출 간부 각각. -exec 내 에서 {}find (파일 경로 + 이름)에 의해 전달 된 인수를 나타냅니다 . 이 명령 은 find 명령 의 끝을 나타내지 않고 이름 이 전달 되도록합니다 .
\;;

위에 제공된 명령에는 -n (작업 없음) 스위치가 있습니다. 따라서 그것은 당신이 그것을 실행하면 어떻게 될지 알려줄 것입니다. 한 번 실행 한 후 제안 된 결과에 만족 한 후에 만 ​​-n 스위치없이이 명령을 실행하는 것이 좋습니다.

이제 정규 표현식을 사용하십시오.

  • ^ 문자열의 시작과 일치합니다.
  • $ 문자열의 끝과 일치합니다.
  • . 모든 문자와 일치합니다.
  • *는 선행 구조물의 0 개 이상을 의미한다. 예를 들어 .*0 개 이상의 문자를 의미합니다.
  • \s 공백 문자를 나타냅니다.
  • \S 공백이 아닌 문자를 나타냅니다.
  • 내 아무것도 ()캡처 도착하고 반영되고 $1, $2그 위치에 따라.

정규식 :

  • 시작시 선택적 디렉토리 구조를 찾고 $ 1로 캡처합니다. (.*/)
  • " -" 까지 모든 것을 건너 뜁니다 ..*-
  • $ 2의 앞뒤 공백을 제외한 나머지 문자열을 캡처합니다. (.*)
  • 파일을 $ 1 $ 2로 다시 작성합니다. "/path/to/file/""filename.mp3"이어야합니다.

내 테스트 실행은 다음과 같습니다.

/tmp/test$ ls -R
.:
a  b  c  z-unknown.mp3

./a:
a3.mp3                 a - longer title3.mp3  c.mp3   disc2
a - longer title2.mp3  a - long title.mp3     disc 1  the band - the title.mp3

./a/disc 1:
a - title1.mp3  a - title2.mp3

./a/disc2:
a - title1.mp3  a - title2.mp3

./b:
cd - ab - title3.mp3  cd - title1.mp3  cd - title2.mp3  c.mp3

./c:
c-pony2.mp4  c - pony3.mp3  c - pony4.mp3  c-pony.mp3

/tmp/test$ find . -name "*.mp3" -exec rename -v 's|^(.*/).*-\s*(.*)\s*$|$1$2|g' {} \;
./c/c-pony.mp3 renamed as ./c/pony.mp3
./c/c - pony4.mp3 renamed as ./c/pony4.mp3
./c/c - pony3.mp3 renamed as ./c/pony3.mp3
./z-unknown.mp3 renamed as ./unknown.mp3
./a/the band - the title.mp3 renamed as ./a/the title.mp3
./a/a - longer title2.mp3 renamed as ./a/longer title2.mp3
./a/a - longer title3.mp3 renamed as ./a/longer title3.mp3
./a/disc 1/a - title1.mp3 renamed as ./a/disc 1/title1.mp3
./a/disc 1/a - title2.mp3 renamed as ./a/disc 1/title2.mp3
./a/a - long title.mp3 renamed as ./a/long title.mp3
./a/disc2/a - title1.mp3 renamed as ./a/disc2/title1.mp3
./a/disc2/a - title2.mp3 renamed as ./a/disc2/title2.mp3
./b/cd - title1.mp3 renamed as ./b/title1.mp3
./b/cd - title2.mp3 renamed as ./b/title2.mp3
./b/cd - ab - title3.mp3 renamed as ./b/title3.mp3

/tmp/test$ ls -R
.:
a  b  c  unknown.mp3

./a:
a3.mp3  c.mp3  disc 1  disc2  longer title2.mp3  longer title3.mp3  long title.mp3  the title.mp3

./a/disc 1:
title1.mp3  title2.mp3

./a/disc2:
title1.mp3  title2.mp3

./b:
c.mp3  title1.mp3  title2.mp3  title3.mp3

./c:
c-pony2.mp4  pony3.mp3  pony4.mp3  pony.mp3

Regexp는 까다로운 사업이며, 글을 쓰는 데 많은 실수를했기 때문에 이것의 장점이 없다는 의견을 환영합니다. 나는 이것을 테스트하는 것을 발견했다는 것을 알고있다.


1

필자는 특히 스크립트 작업을 위해 파일 및 디렉토리 이름을 바꾸는 명령 줄 Java 프로그램을 만들었습니다. 무료이며 오픈 소스이므로 마음의 내용으로 수정할 수 있습니다.

이름 바꾸기 및
http://renamewand.sourceforge.net/

관련 사용 예 :

양식의 파일을 "<a> - <b>"해당 디렉토리로 이동하십시오 "<a>".

java -jar RenameWand.jar  "<a> - <b>"  "<a>/<b>"

마지막으로 수정 한 시간별로 파일을 정렬하고 3 자리 숫자로 이름을 바꿉니다.

java -jar RenameWand.jar  "<a>"  "<3|#FT> <a>"

파일 이름의 일부를 재정렬하고 대소 문자를 변경하십시오.

java -jar RenameWand.jar  "<album> - <artist> - <song>.<ext>" 
                          "<artist.upper> <album.title> - <song>.<ext.lower>"

1

zmv zsh 이름 바꾸기 도구는 매우 좋습니다.

# zmv "programmable rename"
# Replace spaces in filenames with a underline
zmv '* *' '$f:gs/ /_'
# Change the suffix from *.sh to *.pl
zmv -W '*.sh' '*.pl'
# lowercase/uppercase all files/directories
$ zmv '(*)' '${(L)1}' # lowercase
$ zmv '(*)' '${(U)1}' # uppercase

여기에 더 많은 메모가 있습니다 ...


0

펭귄 헤드의 경우 쉘 스크립트 또는 AWK 스크립트로 쉽게 수행 할 수 있습니다. 우리에게는 단순한 필멸의 자정을 시험해보고 싶을 수도 있습니다. 쉘 프롬프트 유형 mc -a에서 대부분의 Linux 배포판에 있습니다. 정규식을 사용하여 파일 이름을 바꿀 수 있습니다. 나는 GeekStuff http://www.thegeekstuff.com/2009/06/how-to-rename-files-in-group/ 의 기사를 사용하여 나를 도와주었습니다.


0

다음은 간단한 명령 줄 예제입니다. 나는 많은 PNG 파일의 이름 중간에 "white"이라는 단어를 가지고 있었다. 나는 그것을 꺼내고 하나의 밑줄 만 남기고 싶었다. 이것은 트릭을했다 :

for i in *.png; do mv "$i" "${i/white/}"; done

0

사용 vidir 다음 편집기가 이름 바꾸기 패턴을 적용하는 기능을 사용할 수 있습니다.

이름

vidir-디렉토리 편집

개요

vidir [--verbose] [directory | file |-] ...

기술

vidir을 사용하면 텍스트 편집기에서 디렉토리의 내용을 편집 할 수 있습니다. 디렉토리를 지정하지 않으면 현재 디렉토리가 편집됩니다.

디렉토리를 편집 할 때 디렉토리의 각 항목은 번호가 매겨진 줄에 나타납니다. 이 숫자는 vidir이 변경된 항목을 추적하는 방법입니다. 줄을 삭제하여 디렉토리에서 파일을 제거하거나 파일 이름을 편집하여 파일 이름을 바꿉니다. 숫자 쌍을 전환하여 파일 이름을 바꿀 수도 있습니다.

"-"를 편집 할 디렉토리로 지정하면 stdin에서 파일 이름 목록을 읽고 편집 할 파일 이름을 표시합니다. 또는 명령 행에서 파일 목록을 지정할 수 있습니다.

실시 예

vidir vidir * .jpeg 일반적인 용도입니다.

찾기 | vidir-서브 디렉토리 내용도 편집합니다. 서브 디렉토리를 삭제하려면 편집기에서 모든 컨텐츠와 서브 디렉토리 자체를 삭제하십시오.

찾기 유형 f | vidir-현재 디렉토리 및 서브 디렉토리 아래의 모든 파일을 편집하십시오.

저자

조이 헤스 2006-2010

Magnus Woldrich 2011에 의한 수정

저작권

위에 나열된 vidir "AUTHOR"의 저작권 2006-2011.

GNU GPL에 따라 라이센스가 부여되었습니다.


0

펄없이 * nix에서 스크립트에 rename사용할 수

일부 * nix에서는 사용 가능한 이름 바꾸기가 없으므로 다른 방법을 사용하여 이름 바꾸기를 수행해야합니다. 몇 년 전에 나는 zmv여기서 훌륭하지만 반드시 사용할 수있는 것은 아니라고 제안 했습니다.

내장 및 sed를 사용하여 셸 스크립트를 신속하게 채울 수 있으므로 perl rename 스크립트와 매우 유사한 구문을 제공하지만 오류 처리 기능이 부족하지만 작업이 완료됩니다.

sedrename() {
  if [ $# -gt 1 ]; then
    sed_pattern=$1
    shift
    for file in $(ls $@); do
      mv -v "$file" "$(sed $sed_pattern <<< $file)"
    done
  else
    echo "usage: $0 sed_pattern files..."
  fi
}

용법

sedrename 's/Beethoven\ -\ //g' *.mp3

before:

./Beethoven - Fur Elise.mp3
./Beethoven - Moonlight Sonata.mp3
./Beethoven - Ode to Joy.mp3
./Beethoven - Rage Over the Lost Penny.mp3

after:

./Fur Elise.mp3
./Moonlight Sonata.mp3
./Ode to Joy.mp3
./Rage Over the Lost Penny.mp3

대상 폴더도 만들고 싶다고 가정 해보십시오 ...

여기에서는 그대로 mv사용할 수없는 폴더를 만들지 않기 때문에 sedrename상당히 작은 변화이므로 폴더 도 포함시키는 것이 좋을 것 같습니다.

abspath새 폴더 구조를 포함하는 sed / rename 패턴에 대한 대상 폴더를 생성 할 수 있도록 유틸리티 기능 (또는 절대 경로)이 필요합니다.

abspath () { case "$1" in
               /*)printf "%s\n" "$1";;
               *)printf "%s\n" "$PWD/$1";;
             esac; }

이를 통해 대상 폴더의 이름을 알 수 있습니다. 이름을 바꿀 때는 대상 파일 이름에서 사용해야합니다.

# generate the rename target
target="$(sed $sed_pattern <<< $file)"

# Use absolute path of the rename target to make target folder structure
mkdir -p "$(dirname $(abspath $target))"

# finally move the file to the target name/folders
mv -v "$file" "$target"

전체 폴더 인식 스크립트는 다음과 같습니다.

sedrename() {
  if [ $# -gt 1 ]; then
    sed_pattern=$1
    shift
    for file in $(ls $@); do
      target="$(sed $sed_pattern <<< $file)"
      mkdir -p "$(dirname $(abspath $target))"
      mv -v "$file" "$target"
    done
  else
    echo "usage: $0 sed_pattern files..."
  fi
}

물론 특정 대상 폴더가없는 경우에도 여전히 작동합니다.

모든 노래를 폴더에 넣고 싶다면 ./Beethoven/다음과 같이하십시오.

용법

sedrename 's|Beethoven - |Beethoven/|g' *.mp3

before:

./Beethoven - Fur Elise.mp3
./Beethoven - Moonlight Sonata.mp3
./Beethoven - Ode to Joy.mp3
./Beethoven - Rage Over the Lost Penny.mp3

after:

./Beethoven/Fur Elise.mp3
./Beethoven/Moonlight Sonata.mp3
./Beethoven/Ode to Joy.mp3
./Beethoven/Rage Over the Lost Penny.mp3

보너스 라운드 ...

이 스크립트를 사용하여 파일을 폴더에서 단일 폴더로 이동 :

일치하는 모든 파일을 모으고 현재 폴더에 저장하려고한다고 가정하면 다음과 같이 할 수 있습니다

sedrename 's|.*/||' **/*.mp3

before:

./Beethoven/Fur Elise.mp3
./Beethoven/Moonlight Sonata.mp3
./Beethoven/Ode to Joy.mp3
./Beethoven/Rage Over the Lost Penny.mp3

after:

./Beethoven/ # (now empty)
./Fur Elise.mp3
./Moonlight Sonata.mp3
./Ode to Joy.mp3
./Rage Over the Lost Penny.mp3

sed 정규식 패턴에 대한 참고 사항

이 스크립트에는 정규 sed 패턴 규칙이 적용되며 이러한 패턴은 PCRE (Perl Compatible Regular Expressions)가 아닙니다. 플랫폼에 따라 sed -r또는 sed -E플랫폼에 따라 확장 정규식 구문을 사용할 수 있습니다.

man re_formatsed 기본 및 확장 정규 표현식 패턴에 대한 전체 설명은 POSIX 호환 을 참조하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.