나는 많은 사진을 가지고 있습니다. 일부는 이고 .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를 사용한다고 가정합니다.