파일 이름 바꾸기


25

여러 파일이 있습니다.

10.3.100.179_01_20161018_230014_5335.jpg
10.3.100.179_01_20161018_231514_0814.jpg
10.3.100.179_01_20161018_233014_5706.jpg
10.3.100.179_01_20161018_234514_0896.jpg
10.3.100.179_01_20161018_230114_5395.jpg
10.3.100.179_01_20161018_231614_1145.jpg
10.3.100.179_01_20161018_233114_6047.jpg
10.3.100.179_01_20161018_234614_0547.jpg
10.3.100.179_01_20161018_230114_5492.jpg
10.3.100.179_01_20161018_231614_1264.jpg
10.3.100.179_01_20161018_233114_6146.jpg
10.3.100.179_01_20161018_234614_0658.jpg
10.3.100.179_01_20161018_230214_5630.jpg
10.3.100.179_01_20161018_231714_7135.jpg

이 형식으로 이름을 바꾸고 싶습니다.

10.4.100.135_01_20161013131108389_TIMING.jpg
10.4.100.135_01_20161013131111390_TIMING.jpg
10.4.100.135_01_20161013131114401_TIMING.jpg
10.4.100.135_01_20161013131117431_TIMING.jpg
10.4.100.135_01_20161013131120418_TIMING.jpg
10.4.100.135_01_20161013131123461_TIMING.jpg
10.4.100.135_01_20161013131126511_TIMING.jpg

시간 _소인 을 제거 하고을 추가해야합니다 _TIMING.



5
질문에 일관된 예를 사용하십시오. 교체 할 것 같습니다 10.3.100.179과 함께 10.4.100.135. 그것은 당신이 원하는 또는 그냥 제거 할 무엇인가 _TIMING하고을 _때부터?
terdon

3
날짜에 대한 iso8601 표준 (파일 이름과 로그 항목 모두에 대해 작동 함)이 있음을 사람들에게 상기시키기에 좋은시기입니다. ^^ 따라서 이름을 다음과 같이 변경해야합니다. YYYY-MM-DDThh : mm : ss.mmm (ex : 첫 번째 파일은 10.4.100.135_01_2016-10-13T13:11:08.389_TIMING.jpg다음과 같습니다. (그리고 "표준화"는 날짜와 시간 (밀리 초)처럼 명확하게 보이기 때문에 제거 될 수 있습니다. 특히 표준이 더 널리 퍼져있을 때 T는 표준의 일부입니다. 그것을 좋아하게 자랐습니다 (그리고 그것을 꺼내는 것은 표준을 ^^습니다)
Olivier Dulac

@OlivierDulac :파일 이름에 사용하지 않는 것이 좋습니다 . Windows가 지원하지 않는다고 생각합니다.
저스틴

@Justin 좋은 지적. 표준은 파일 이름으로 삭제하는 것이 좋습니다. 파일 내 버전을 제공했습니다
Olivier Dulac

답변:


38

좋아하는 텍스트 편집기를 설치 renameutils하고 사용 qmv하십시오.

qmv편집기에서 모든 이름을로드하고 저장하고 닫으면 변경 사항이 실제 파일에 적용됩니다. 변경 사항이 일치하지 않으면 (예 : 두 파일의 이름이 동일 함) 아무 것도 건드리지 않고 중단됩니다. 또한 순환 이름 변경을 올바르게 처리합니다.

나는 보통 :

$ qmv -f do

이름 열이 하나만 표시되도록합니다 (대상 : 대상 전용). 그 모습은 다음과 같습니다.

qmw

SublimeText, Atom 또는 Visual Studio Code의 여러 커서와 결합하면 대량 이름 바꾸기에 매우 훌륭하고 강력한 도구가됩니다. 예를 들어 Atom의 경우을 수행 EDITOR="atom -w" qmv -f do합니다.


1
askUbuntu에 오신 것을 환영합니다! 이거 대박!
αғsнιη

그냥 +에 서명했습니다! 그것. ;)
J. Allan

2
와우, 멋진 도구와 멋진 GIF 애니메이션. 큰 첫 번째 대답, 환영합니다! :)
바이트 사령관

1
이미지를 인라인 해 주신 @KasiyA에게 감사하고 긍정적 인 의견을 주신 다른 분들께도 감사드립니다.
ateijelo

1
@kasperd 예, 이름 변경 계획에 오류가 있음을 경고하고 추가 조치를 취할 수있는 대화식 콘솔을 엽니 다.
ateijelo

27

사용 rename...

rename -n 's/^([0-9]+\.[0-9]\.[0-9]+\.[0-9]+_[0-9]+_)([0-9]+)_([0-9]+)_([0-9]+)\.jpg/$1$2$3$4_TIMING\.jpg/' *

이를 통해 -n변경하지 않고 수행 할 작업을 출력합니다.

rename(10.3.100.179_01_20161018_230014_5335.jpg, 10.3.100.179_01_201610182300145335_TIMING.jpg)
rename(10.3.100.179_01_20161018_231514_0814.jpg, 10.3.100.179_01_201610182315140814_TIMING.jpg)
rename(10.3.100.179_01_20161018_233014_5706.jpg, 10.3.100.179_01_201610182330145706_TIMING.jpg)
rename(10.3.100.179_01_20161018_234514_0896.jpg, 10.3.100.179_01_201610182345140896_TIMING.jpg)

제대로 보이는 경우 -n

$ rename 's/^([0-9]+\.[0-9]\.[0-9]+\.[0-9]+_[0-9]+_)([0-9]+)_([0-9]+)_([0-9]+)\.jpg/$1$2$3$4_TIMING\.jpg/' *
$ ls
10.3.100.179_01_201610182300145335_TIMING.jpg  10.3.100.179_01_201610182330145706_TIMING.jpg
10.3.100.179_01_201610182315140814_TIMING.jpg  10.3.100.179_01_201610182345140896_TIMING.jpg

설명하는 중 ...

  • s/something/something_else/ 검색 및 교체
  • ^ 이름의 시작 (고정)
  • [0-9] 어떤 숫자
  • + 선행 캐릭터 중 하나 이상
  • \.리터럴 .( \이 문자가 없으면 모든 문자와 일치)
  • () 이 부분을 유지
  • $1$2$3$3 이전에 일치하고 유지 된 것들에 대한 역 참조 ()

참고 : *명령 끝에서 현재 디렉토리의 모든 보이는 파일과 일치합니다. 필요한 경우 더 적합한 글로브를 사용하십시오.


2
일부 배포판에서는이 명령을 다음과 같이 사용할 수 있습니다 prename(첫 번째 인수는 perl 표현식이므로 perl의 경우 p).
Peter Cordes

12

mmv 다음과 같이 할 수 있습니다.

mmv '*_*_*_*_*.jpg' '#1_#2_#3#4#5_TIMING.jpg'

10.3.100.179_01_20161018_230014_5335.jpg 10.3.100.179_01_201610182300145335_TIMING.jpg

# 1, # 2, # 3, ...는 여기서 각각 하나의 일치하는 '*'를 참조합니다.

다음과 같이 더 짧습니다.

mmv '*_*_*.jpg' '#1#2#3_TIMING.jpg'

9

다른 rename접근법 :

$ rename -n 's/(.*)_(.*)_(.*)\./$1$2$3_TIMING./' *
10.3.100.179_01_20161018_230014_5335.jpg -> 10.3.100.179_01_201610182300145335_TIMING.jpg
10.3.100.179_01_20161018_230114_5395.jpg -> 10.3.100.179_01_201610182301145395_TIMING.jpg
10.3.100.179_01_20161018_230114_5492.jpg -> 10.3.100.179_01_201610182301145492_TIMING.jpg
10.3.100.179_01_20161018_230214_5630.jpg -> 10.3.100.179_01_201610182302145630_TIMING.jpg
10.3.100.179_01_20161018_231514_0814.jpg -> 10.3.100.179_01_201610182315140814_TIMING.jpg
10.3.100.179_01_20161018_231614_1145.jpg -> 10.3.100.179_01_201610182316141145_TIMING.jpg
10.3.100.179_01_20161018_231614_1264.jpg -> 10.3.100.179_01_201610182316141264_TIMING.jpg
10.3.100.179_01_20161018_231714_7135.jpg -> 10.3.100.179_01_201610182317147135_TIMING.jpg
10.3.100.179_01_20161018_233014_5706.jpg -> 10.3.100.179_01_201610182330145706_TIMING.jpg
10.3.100.179_01_20161018_233114_6047.jpg -> 10.3.100.179_01_201610182331146047_TIMING.jpg
10.3.100.179_01_20161018_233114_6146.jpg -> 10.3.100.179_01_201610182331146146_TIMING.jpg
10.3.100.179_01_20161018_234514_0896.jpg -> 10.3.100.179_01_201610182345140896_TIMING.jpg
10.3.100.179_01_20161018_234614_0547.jpg -> 10.3.100.179_01_201610182346140547_TIMING.jpg
10.3.100.179_01_20161018_234614_0658.jpg -> 10.3.100.179_01_201610182346140658_TIMING.jpg

원하는대로 작동하면을 제거하십시오 -n.


5

다음을 사용할 수도 있습니다. 먼저 파일을 백업하고 다음을 시도하십시오.

find . -name "*.jpg" -type f -print0| while read -d $'\0' file
do
    #extension="${file##*.}"
    newfilename=$(echo "${file%.*}" | sed 's/\(.*\)_\(.*\)_/\1\2/')
    mv "$file" "$newfilename""_TIMING.jpg"
done

sed 's/\(.*\)_\(.*\)_/\1\2/')_타임 스탬프 의 문자를 삭제합니다 .

예를 들면 다음과 같습니다.

user@host$ ls -lart
total 8
drwxrwxr-x 6 user user 4096 Oct 21 10:21 ..
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_230014_5335.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_231514_0814.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_233014_5706.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_234514_0896.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_230114_5395.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_231614_1145.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_233114_6047.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_234614_0547.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_230114_5492.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_231614_1264.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_233114_6146.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_234614_0658.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_230214_5630.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_231714_7135.jpg
drwxrwxr-x 2 user user 4096 Oct 21 10:30 .

user@host$ find . -name "*.jpg" -type f -print0 | while read -d $'\0' file
> do
>  newfilename=$(echo "${file%.*}" | sed 's/\(.*\)_\(.*\)_/\1\2/')
>  mv $file $newfilename"_TIMING.jpg"
> done

10:35:20 t $ ls -lart
total 8
drwxrwxr-x 6 user user 4096 Oct 21 10:21 ..
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_201610182300145335_TIMING.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_201610182315140814_TIMING.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_201610182330145706_TIMING.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_201610182345140896_TIMING.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_201610182301145395_TIMING.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_201610182316141145_TIMING.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_201610182331146047_TIMING.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_201610182346140547_TIMING.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_201610182301145492_TIMING.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_201610182316141264_TIMING.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_201610182331146146_TIMING.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_201610182346140658_TIMING.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_201610182302145630_TIMING.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_201610182317147135_TIMING.jpg
drwxrwxr-x 2 user user 4096 Oct 21 10:35 .

1
이것이 가장 좋은 해결책입니다. 물론 Zanna의 soultion은 몇 개의 파일에 완벽하지만 쉘이 globbing을 수행하므로 많은 파일에서 솔루션이 실패 할 수 있습니다 (명령 문자열이 너무 깁니다).
rexkogitans

@rexkogitans : 최신 Linux 시스템 (예 : Ubuntu의 모든 버전)을 사용하는 경우 명령 줄 길이의 제한은 여러 메가 바이트입니다. 문제가있는 경우 find -maxdepth 1 -exec rename ... {} +현재 디렉토리 목록을 이름 바꾸기 명령 줄에 배치하는 데 사용할 수 있습니다 . ( -name *.jpg또는 원하는 것을 추가하십시오 ). 시스템 이름 바꾸기 대신 포크 + 실행 sedmv모든 파일 이름에 대해 쉘 루프보다 훨씬 빠르게 실행됩니다 . ( sedbash의 내장 정규 표현식 을 사용하지 않아도되지만 포크 mv는 여전히 느립니다.)
Peter Cordes

2

당신은 아마 완료,하지만 여기에 (단순) 전부 bash솔루션 :
"간단한 ... bash는 솔루션은"모순인가?

#!/bin/bash

#loop through all files ending in .jpg
for f in *.jpg;
do

    #cut out everything to the timestamp
    firsthalf=${f%_*_*_*}

    #get from the timestamp on
    lasthalf=${f#*_*_}

    #remove (all) underscores from timestamp
    #note the 2 forward slashes...
    lasthalf=${lasthalf//_/}

    #get our extension
    ext=${lasthalf##*.}

    #now we can remove the extension
    lasthalf=${lasthalf%.*}

    #rename the file
    #change `mv` to `echo` if you want to do a trial run first...
    mv "$f" "${firsthalf}_${lasthalf}_TIMING.${ext}"

done;

추신 : 루프의 논리는 예제 파일 이름 중 하나로 테스트되었습니다. 통과했습니다.


1
아마도 bash 정규식 [[ $f ~= (.*)_(.*)_(.*)_(.*)\.jpg ]]; newname=${BASH_REMATCH[1]${BASH_REMATCH:2:4}TIMING.jpg이나 다른 것을 사용하는 것이 좋습니다. (완전히 테스트되지 않았으며 잘못되었을 수도 있지만, 일반적으로 캡처 그룹은 BASH_REMATCH 배열에 들어가는 것이 일반적입니다.)
Peter Cordes

@ PeterCordes : 좋은 지적입니다! 나는 ( bash) 캡처 그룹을 사용한 적이 없으며 완벽하게 정직하기 위해 bash는 내가 시도한 첫 번째 언어가 아닙니다. ( bash추악한 언어 라고 생각 합니다.) 여전히 좋은 해결책이며 저에게 뭔가를 가르쳐주었습니다.
J. Allan

순수한 bash에서 많은 텍스트 처리를 수행하는 주된 이유는 빠른 탭 완성 함수를 작성할 때입니다. 그것은 "못생긴 코드"라는 구절에 완전히 새로운 의미를 부여합니다 ...
Peter Cordes

@PeterCordes : 비록 내가 당신의 포인트를 얻을 내가 그 코드는 생각하지 않는다 "추악한." 그것은 당신이 준 2 줄 해결책이 아닐 수도 있지만, 내가 염려하는 한 읽기는 어렵지 않습니다. 게다가 그것은 잘 주석이 달린 ...
J. Allan

나는 bash-completion 코드가 일반적으로 추악하거나 적어도 읽기 어렵다고 이야기했다. 실제로 추악하지는 않지만 다소 마음을 굽히는 것입니다 (예 : 변수 이름을 전달하고 수신자 printf -v "$3" ...가 이름이있는 변수를 설정하는 데 사용하는 bash에서 ref로 args 전달 $3) 전체 명령 줄을 분리하고 다시 넣습니다. 함께 따라하기 / 디버그하기가 어렵습니다. 적어도 버그를 정리 / 수정하려고하는 동안 그 방법을 찾았습니다.
Peter Cordes

1

GUI를 사용할 수 있다면 pyRenamer 을 권장 합니다 .

우분투에서 대부분의 배포판에 존재합니다.

sudo apt-get install pyrenamer

원하는 모든 것을 할 수 있습니다.

  • 패턴을 사용하거나 텍스트를 추가하거나 억제 할 수 있습니다.
  • 사진 이름을 바꾸면 EXIF ​​데이터에 액세스 할 수 있으므로 날짜 / 시간 등에 따라 패턴을 생성 할 수 있습니다.
  • 음악 파일 이름을 바꾸는 경우 일부 메타 데이터를 사용할 수 있습니다.
  • 또한 미리보기 가있어 되돌릴 수없는 실수를 예방할 수 있습니다.

침략자에게 ... 왜 그런지 설명 할까? OP는 GUI가 옵션인지 여부를 지정하지 않았습니다. 대부분의 답변은 콘솔 / 스크립트 방식으로 진행되지만 많은 사용자가 GUI 솔루션을 높이 평가합니다. 또는 pyRenamer에 내가 모르는 결함이있을 수 있습니다. 어쨌든, 나는 공감 비의 이유를 알고 싶습니다.
jrierab

빠른 대화식 GUI 접근 방식을 위해 Thunar Bulk Renamer를 제안 할 수도 있습니다.
Tony Martin

@TonyMartin 이것은 문제의 의견이어야합니다, 이것은 답변과 아무 관련이 없습니다
Sergiy Kolodyazhnyy

0

다음은 원시 내장 find + xargs+ sed+ mvoneliner입니다 (love oneliners).

find . -name "*.jpg" -print0 | sort -z | xargs -0 sh -c 'for filename; do mv "$filename" $(echo "${filename}" | sed "s/\([0-9]\{8\}\)_\([0-9]\{6\}\)_\([0-9]\{4\}\)/\1\2\3_TIMING/g"); done' sh

설명:

  • find . -name "*.jpg" | sort | xargs sh -c <command> sh : 현재 디렉토리에있는 모든 JPEG를 나열한 다음 각각에 대해 쉘 명령을 실행합니다 (물론 정렬은 선택 사항이지만 어딘가에 로깅하는 경우에는 약간 깨끗하게 유지하십시오)

  • -print0, -z, -0: 그것은 바이너리 별도의 항목에 대한 좋은 습관 인 0- 더 - 중간 백색 공간 (아닌 경우는 아니지만) 문제를 방지하기 위해 파일 이름을 토큰 화하는 경우

  • mv "$filename" $(echo "${filename}" | sed "s/\([0-9]\{8\}\)_\([0-9]\{6\}\)_\([0-9]\{4\}\)/\1\2\3_TIMING/g");(백 슬래시 sed의 정규식의 가독성을 도움이되지만 그렇지 않는 것입니다 간단한) 자신의 인접 연결 플러스이 8 + 6 + 4 자리의 밑줄-, 분리하고 순서를 교체하여 각 파일의 이름을 바꿀 _TIMING것 ( \i받는 역 참조입니다 i- 정규식 그룹).


심판 : Xargs - man sed

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