이름과 확장자를 알 수 없는 파일 이름 일괄 변경

이름과 확장자를 알 수 없는 파일 이름 일괄 변경

나는 많은 사진을 가지고 있습니다. 일부는 이고 .jpg일부는 입니다 .png. 주어진 그림은 완전히 임의의 이름을 가질 수 있습니다(공백을 포함할 수 있음). 특정 디렉터리 내에서 확장자를 변경하지 않고 모든 디렉터리의 이름을 바꾸려면 어떻게 해야 합니까? 예를 들면 다음과 같습니다.

001.jpg
02.png
05.png
zzzz.jpg

0001로 시작 하고 9999(필요한 경우) 4자리 숫자로 이름을 완전히 바꾸고 싶습니다 . 따라서 출력은 다음과 같습니다.

0001.jpg
0002.png
0003.png
0004.jpg

이 파일의 순서는 나에게 중요하지만 파일 이름별로 정렬하면 이미 순서대로 정렬되어 있습니다.

나는 Perl을 확인해 보았 rename으며 이 예에서 Perl의 사용법은 나에게 미스터리입니다.

답변1

펄 솔루션

perl -e '
    @files = sort glob "*.png *.jpg";
    for(@files){ 
        ($extension = $_) =~ s/.*\.(.*)/$1/;
        $new_name = sprintf("%04d",++$counter).".$extension";
        die "File $new_name already exists and would be clobbered\n" if -e $new_name;
        rename $_ => sprintf("%04d",++$counter).".$extension"
     }'

쿵쿵 솔루션

export COUNT=0 
find . -maxdepth 1 -name "*.jpg" -o -name "*.png" -print0 | xargs -0 sort | while read file do\
extension=${file##*.}\
COUNT=$((COUNT+1))\
mv -- "$file" $(printf "%04d" $COUNT).$extension\
done

노트

  • 두 솔루션 모두 테스트되지 않은 Bash 솔루션입니다. 먼저 더미 파일에서 사용해 보세요.
  • 파일 이름에 개행 문자가 포함되어 있으면 Bash 솔루션이 중단될 수 있습니다.
  • 위험:Gilles가 아래 설명에서 지적했듯이 원본 파일 중 하나의 이름이 대상 명명 규칙을 따르는 경우 기껏해야 다른 "숫자"로 이름이 바뀌고 최악의 경우 다른 파일에 의해 손상됩니다. 어떤 일이 발생하는지는 다른 파일과 관련하여 어떻게 정렬되는지에 따라 다릅니다. OP가 선호하는 것 같았기 때문에 Perl 솔루션에 이에 대한 조항을 추가했습니다.
  • Perl 솔루션(위 구현)은 다음과 같습니다.비멱등성.

답변2

( bash해결책)

printf새 이름의 형식을 지정하고 awk파일 확장자를 선택하는 데 사용됩니다 ...

$ ls
a.b  c.d  e.f  g.h  i.j  k.l  m.n  o.p  q.r  s.t  this file.y  u.v  w.x
$ COUNTER=0
$ for i in *; do COUNTER=$(($COUNTER + 1)); mv -v "$i" $(printf "%04g" $COUNTER).$(echo $i | awk -F'.' '{print $NF}'); done
`a.b' -> `0001.b'
`c.d' -> `0002.d'
`e.f' -> `0003.f'
`g.h' -> `0004.h'
`i.j' -> `0005.j'
`k.l' -> `0006.l'
`m.n' -> `0007.n'
`o.p' -> `0008.p'
`q.r' -> `0009.r'
`s.t' -> `0010.t'
`this file.y' -> `0011.y'
`u.v' -> `0012.v'
`w.x' -> `0013.x'

$i언급한 대로 파일 이름의 공백을 이스케이프하려면 입력을 따옴표로 묶어야 합니다.

답변3

존재하다TxR분명하지 않은 말투:

(let ((counter 0))
  (each ((name (sort (glob "*.{png,jpg}"))))
    (let ((new (pic "0###<" (inc counter) (short-suffix name))))
      (if (path-exists-p new)
        (error `@new already exists`))
      (rename-path name new))))

먼저 이름 바꾸기 목록을 준비하고 동시에 올바른 이름이 존재하는지 확인하는 등의 다른 작업을 수행할 수 있습니다. 이 경우 이름 바꾸기를 수행하지 않습니다.

여기에 이미지 설명을 입력하세요.

답변4

이 스크립트를 저장하세요.

#!/bin/bash

NUM=0
NUMBER_LENGTH=4

cd $1;

ls . -1 | sort | while read file; do
    NUM=$(( $NUM + 1 ));
    PREFIX=$NUM;
    while [ ${#PREFIX} != $NUMBER_LENGTH ]; do
        PREFIX="0${PREFIX}";
    done;
    NEW_NAME=$PREFIX.`echo $file | sed 's|[^.]\+\.\([\A-Za-z0-9]\+\)|\1|g'`;
    mv "$file" "$NEW_NAME";
done

다음과 같이 실행합니다.

./_scriptname_ _dirWhereYourStuffIs_

참고: 스크립트 자체의 이름이 변경되므로 스크립트를 작업과 동일한 디렉터리에 넣지 마십시오.

충분히 미친 경우 스크립트를 사용하지 않고 한 줄로 모든 작업을 수행할 수 있습니다.

NUM=0; NUMBER_LENGTH=4; ls . -1 | sort | while read file; do NUM=$(( $NUM + 1 )); PREFIX=$NUM; while [ ${#PREFIX} != $NUMBER_LENGTH ]; do PREFIX="0${PREFIX}"; done; NEW_NAME=$PREFIX.`echo $file | sed 's|[^.]\+\.\([\A-Za-z0-9]\+\)|\1|g'`; mv "$file" "$NEW_NAME"; done

참고 #2: 이 줄에서는 BASH를 사용한다고 가정합니다.

관련 정보