디렉토리의 파일 이름을 순차적 번호로 바꾸고 싶습니다. 파일 생성 날짜를 기준으로합니다.
예를 들어, sadf.jpg
에 0001.jpg
, wrjr3.jpg
에 0002.jpg
등등, 파일의 총 금액 (필요하지 않은 경우 추가 제로에 대한 필요)에 따라 선행 0의 수.
디렉토리의 파일 이름을 순차적 번호로 바꾸고 싶습니다. 파일 생성 날짜를 기준으로합니다.
예를 들어, sadf.jpg
에 0001.jpg
, wrjr3.jpg
에 0002.jpg
등등, 파일의 총 금액 (필요하지 않은 경우 추가 제로에 대한 필요)에 따라 선행 0의 수.
답변:
루프 let
및 printf
패딩에 사용하십시오.
a=1
for i in *.jpg; do
new=$(printf "%04d.jpg" "$a") #04 pad to length of 4
mv -i -- "$i" "$new"
let a=a+1
done
-i
플래그를 사용하면 기존 파일을 자동으로 덮어 쓰지 않습니다.
printf -v new "%04d.jpg" ${a}
값을 변수에 넣을 수도 있습니다 . 그리고 ((a++))
변수를 증가시키기 위해 작동합니다. 또한 이것은 생성 날짜 순서로 수행하지 않거나 OP가 지정한 패딩을 최소화하지 않습니다. 그러나 Linux / Unix는 작성 날짜를 저장하지 않습니다.
mv -- "$i" "$new"
대시로 시작하는 소스 파일 이름을 올바르게 처리하는 데 사용 하는 것이 좋습니다 . 그대로, mv
이러한 파일 이름을 플래그 모음으로 구문 분석하려고 시도합니다.
-i
대답에 포함되어야하며 그에 따라 메모를 다시 작성해야 한다고 생각 합니다. 더 안전합니다. :(
한 줄의 아름다움 :
ls -v | cat -n | while read n f; do mv -n "$f" "$n.ext"; done
당신은 변경할 수 .ext
와 .png
, .jpg
등
ls | cat -n | while read n f; do mv "$f" `printf "%04d.extension" $n`; done
제로 패딩 번호를 가지고
-n
실수로 파일을 덮어 쓰지 않도록 mv 명령에 추가 할 수 있습니다 . 이 어려운 방법을 발견했습니다!
ls -1prt | grep -v "/$" | cat -n | while read n f; do mv -n "${f}" "$(printf "%04d" $n).${f#*.}"; done
결과 : (1 것은) 나중에 나중에 인덱스 파일, 수정의 순서로 정렬; (2) 디렉토리를 무시하고 재귀 적이 지 않습니다. (3) 패드 인덱스; (4) 원래 확장을 유지합니다.
나는 단순성에 대한 gauteh의 솔루션을 좋아하지만 중요한 단점이 있습니다. 수천 개의 파일에서 실행하면 "인수 목록이 너무 깁니다"라는 메시지가 표시되고 ( 더 자세한 내용은이 스크립트에서) 스크립트가 실제로 느려질 수 있습니다. 필자의 경우 약 36.000 파일에서 실행하면 스크립트가 약 이동했습니다. 초당 1 개의 아이템! 왜 이런 일이 발생하는지 잘 모르겠지만 동료로부터 얻은 규칙은 " find
당신의 친구" 였습니다.
find -name '*.jpg' | # find jpegs
gawk 'BEGIN{ a=1 }{ printf "mv %s %04d.jpg\n", $0, a++ }' | # build mv command
bash # run that command
아이템을 세고 명령을 빌드하기 위해 gawk 가 사용되었습니다. 그러나 주요 차이점에 유의하십시오. 기본적 find
으로 현재 디렉토리 및 해당 서브 디렉토리에서 파일을 검색하므로 필요한 경우 현재 디렉토리에서만 검색을 제한 man find
하십시오 (방법을 보는 데 사용 ).
NR
더 짧은 명령에 행 번호를 사용하도록 수정했습니다 . gawk '{ printf "mv %s %04d.jpg\n", $0, NR }'
$(rm -rf /).jpg
.
for
루프는 엄밀히 말하면, 파일 당 1 초 복용하지 않습니다. 파일 시스템에서 36,000 개의 파일 이름을 가져 오는 데 시간이 오래 걸리고 합리적으로 빠르게 반복됩니다. 많은 파일 시스템은 어떤 정확한 명령을 실행하든 큰 디렉토리에 문제가 있습니다. 그러나 일반적으로 일치하는 파일 목록 find
을 가져 와서 정렬 해야하므로 쉘 와일드 카드보다 빠릅니다 .
"이름 바꾸기"명령으로
rename -N 0001 -X 's/.*/$N/' *.jpg
또는
rename -N 0001 's/.*/$N.jpg/' *.jpg
rename
(Linux Mint 13)에는 -N
옵션 이 없습니다 .
rename
명령을 좋아 하지만 결코 알지 못했습니다 -N
! 감사!
rename
. @Bostrot에 의해 게시 된 링크는 또 다른 이름 바꾸기 도구이며 @RomanRhrnNesterov가 그 이름을 사용한 것처럼 보입니다. ¶ rename
Peder Stray와 Larry Wall ( debian / ubuntu의 perl-rename
패키지와 arch linux의 패키지) 의 모든 사용자에게 rename
: $N
스스로 정의 할 수 있습니다 :perl-rename '$N=sprintf("%04d",++$N); s/.*/$N.jpg/' *.jpg
OSX에서 Pero 솔루션을 사용하려면 약간의 수정이 필요했습니다. 나는 사용했다 :
find . -name '*.jpg' \
| awk 'BEGIN{ a=0 }{ printf "mv \"%s\" %04d.jpg\n", $0, a++ }' \
| bash
참고 : 백 슬래시는 줄 연속을 위해 존재합니다
2015 년 7 월 20 일 수정 : 공백이있는 파일 이름을 지원하기 위해 명령
의 \"%s\"
인수 를 인용하기 위해 @klaustopher의 피드백을 통합했습니다 mv
.
$(rm -rf /).jpg
.
mv
. ie라는 파일이 some thing.jpg
있으면 스크립트가 실패합니다. 이것이 내가 사용한 것입니다 :find . -name '*.jpg' | awk 'BEGIN{ a=0 }{ printf "mv \"%s"\ wallpaper-%04d.jpg\n", $0, a++ }' | bash
-maxdepth 1
미안보다 안전하는 것이 낫기 때문에 현재 디렉토리의 jpg에서만 작동 하는 데 사용 합니다.
ls -1 *.jpg
찾기 대신 사용할 수 있습니다 . 그렇지 않으면 정렬되지 않습니다. 또는 |sort|
awk 전
원래 확장을 유지하고 선행 0을 추가하며 OSX에서도 작동하는 매우 간단한 bash 하나의 라이너
num=0; for i in *; do mv "$i" "$(printf '%04d' $num).${i#*.}"; ((num++)); done
9.ext
이전 11.ext
에 정렬되지 않지만 다른 도구 (와 같은 ls
)는 그렇게하지 않습니다.
모든 상황에서 작동하려면 이름에 공백이있는 파일에 \ "를 넣으십시오.
find . -name '*.jpg' | gawk 'BEGIN{ a=1 }{ printf "mv \"%s\" %04d.jpg\n", $0, a++ }' | bash
$(rm -rf /)
은 여전히 유효합니다.
rename
지원하지 않는 경우 -N
다음과 같이 할 수 있습니다.
ls -1 -c | xargs rename -n 's/.*/our $i; sprintf("%04d.jpg", $i++)/e'
편집 주어진 숫자로 시작하려면 아래의 (어떤 못생긴 것처럼 보이는) 코드를 사용하고 123을 원하는 숫자로 바꾸십시오.
ls -1 -c | xargs rename -n 's/.*/our $i; if(!$i) { $i=123; } sprintf("%04d.jpg", $i++)/e'
생성 시간순으로 파일을 나열한 다음 (가장 먼저 -r
정렬하려면 ls에 추가 )이 파일 목록을 보내 이름을 바꿉니다. 이름 바꾸기는 정규식에서 perl 코드를 사용하여 카운터를 형식화하고 증가시킵니다.
그러나 EXIF 정보가 포함 된 JPEG 이미지를 다루는 경우 권장합니다. exiftool
이것은에서입니다 exiftool 문서 "이름 바꾸기 예"에서,
exiftool '-FileName<CreateDate' -d %Y%m%d_%H%M%S%%-c.%%e dir
Rename all images in "dir" according to the "CreateDate" date and time, adding a copy number with leading '-' if the file already exists ("%-c"), and
preserving the original file extension (%e). Note the extra '%' necessary to escape the filename codes (%c and %e) in the date format string.
rename
?를 사용하여 특정 번호에서 어떻게 시작할 수 있습니까?
OSX 에서 Homebrew의 이름 바꾸기 스크립트를 설치하십시오.
brew install rename
그러면 정말 말도 안되게 쉽게 할 수 있습니다.
rename -e 's/.*/$N.jpg/' *.jpg
또는 멋진 접두사를 추가하려면 다음을 수행하십시오.
rename -e 's/.*/photo-$N.jpg/' *.jpg
Global symbol "$N" requires explicit package name (did you forget to declare "my $N"?) at (user-supplied code).
비슷한 문제가 있었고 그 이유로 쉘 스크립트를 작성했습니다. 나는 누군가에게 도움이 될 수 있다고 생각하기 때문에 많은 좋은 답변이 이미 게시되어 있음에 관계없이 게시하기로 결정했습니다. 자유롭게 개선하십시오!
@Gnutt 원하는 동작은 다음을 입력하여 얻을 수 있습니다.
./numerate.sh -d <path to directory> -o modtime -L 4 -b <startnumber> -r
옵션 -r
을 생략하면 리밍 만 시뮬레이션됩니다 (테스트에 도움이 됨).
otion L은 대상 번호의 길이를 나타냅니다 (앞의 0으로 채워짐) -p <prefix>
-s <suffix>
. 옵션으로 접두사 / 접미사를 추가 할 수도 있습니다 .
누군가 번호가 매기기 전에 파일을 숫자로 정렬하려면 -o modtime
옵션을 제거하십시오 .
우리는이 파일들이 생성 순서대로 나열된 디렉토리에 있다고 가정합시다.
a.jpg
b.JPG
c.jpeg
d.tar.gz
e
그런 다음 ls -1cr
위의 목록을 정확하게 출력합니다. 그런 다음 사용할 수 있습니다 rename
:
ls -1cr | xargs rename -n 's/^[^\.]*(\..*)?$/our $i; sprintf("%03d$1", $i++)/e'
어떤 출력
rename(a.jpg, 000.jpg)
rename(b.JPG, 001.JPG)
rename(c.jpeg, 002.jpeg)
rename(d.tar.gz, 003.tar.gz)
Use of uninitialized value $1 in concatenation (.) or string at (eval 4) line 1.
rename(e, 004)
확장자가없는 파일에 대해서는 "초기화되지 않은 값 사용 […]"경고가 표시됩니다. 당신은 그것을 무시할 수 있습니다.
실제로 이름을 바꾸 -n
려면 rename
명령 에서 제거하십시오 .
이 답변은 2014 년 4 월 누가의 답변에서 영감을 얻었습니다 . 총 파일 수에 따라 선행 0 수를 설정해야하는 Gnutt의 요구 사항은 무시합니다.
ls -1tU
제작 시간 으로 변경하여 순서를 조정할 수 있었기 때문 입니다. rename
내가 가지고 있지 않은 설치 도 필요했습니다 .
거의 수정하지 않고 Pero의 솔루션을 다시 사용하십시오. find
하면 주문 항목의 디렉토리 트리를 순회하므로 디렉토리 항목 내에 저장됩니다. 이것은 대부분 같은 머신에서 실행마다 일관되며 삭제가없는 경우 본질적으로 "파일 / 디렉토리 작성 순서"입니다.
그러나 어떤 경우에는이 예제에서 사용되는 논리적 순서 (예 : 이름)를 가져와야합니다.
find -name '*.jpg' | sort -n | # find jpegs
gawk 'BEGIN{ a=1 }{ printf "mv %s %04d.jpg\n", $0, a++ }' | # build mv command
bash # run that command
blahblah; rm -r * blahblah.jpg
어떻게합니까?
jpg로 제한되는 시간별로 정렬되며 선행 0과 기본 이름 (원하는 경우) :
ls -t *.jpg | cat -n | \
while read n f; do mv "$f" "$(printf thumb_%04d.jpg $n)"; done
(없이 한 줄에 \
)
ls
그래도 스크립트에서 사용 하는 모든 것을 공개하는 것을 망설 입니다.
ls -1tr | rename -vn 's/.*/our $i;if(!$i){$i=1;} sprintf("%04d.jpg", $i++)/e'
이름 바꾸기 -vn- 테스트 모드를 해제 하기 위해 n 제거
{$ i = 1;} -제어 시작 번호
"% 04d.jpg" -제어 카운트 0 04 및 출력 확장자 .jpg 설정
rename -v -n 's/../our $i;if(!$i){$i=1;} sprintf("%02d", $i++)/e' *
나 에게이 답변 조합은 완벽하게 작동했습니다.
ls -v | gawk 'BEGIN{ a=1 }{ printf "mv %s %04d.jpg\n", $0, a++ }' | bash
ls -v
1 10 9를 올바르게 주문하는 데 도움이됩니다. 1 9 10 순서, jpg JPG jpeg의 파일 이름 확장명 문제 방지gawk 'BEGIN{ a=1 }{ printf "mv %s %04d.jpg\n", $0, a++ }'
4 자로 시작하고 0을 앞에 붙입니다. mv를 피함으로써 실수로 같은 번호를 사용하여 이미 존재하는 것을 덮어 쓰려고 시도하지 않습니다.bash
실행@xhienne이 말한 바를 알고, 알 수없는 내용을 bash로 파이프하는 것은 보안 위험입니다. 그러나 스캔 한 사진을 사용하는 경우에는 그렇지 않았습니다.
ls를 사용할 수도 있습니다
ls *.JPG| awk 'BEGIN{ a=0 }{ printf "mv %s gopro_%04d.jpg\n", $0, a++ }' | bash
blahblah; rm -r * blahblah.JPG
어떻게합니까?
다른 솔루션의 대부분은 이미 숫자로 명명 된 기존 파일을 덮어 씁니다. 이는 스크립트를 실행하고 파일을 추가 한 다음 스크립트를 다시 실행하는 경우 특히 문제가됩니다.
이 스크립트는 기존 숫자 파일의 이름을 먼저 바꿉니다.
#!/usr/bin/perl
use strict;
use warnings;
use File::Temp qw/tempfile/;
my $dir = $ARGV[0]
or die "Please specify directory as first argument";
opendir(my $dh, $dir) or die "can't opendir $dir: $!";
# First rename any files that are already numeric
while (my @files = grep { /^[0-9]+(\..*)?$/ } readdir($dh))
{
for my $old (@files) {
my $ext = $old =~ /(\.[^.]+)$/ ? $1 : '';
my ($fh, $new) = tempfile(DIR => $dir, SUFFIX => $ext);
close $fh;
rename "$dir/$old", $new;
}
}
rewinddir $dh;
my $i;
while (my $file = readdir($dh))
{
next if $file =~ /\A\.\.?\z/;
my $ext = $file =~ /(\.[^.]+)$/ ? $1 : '';
rename "$dir/$file", sprintf("%s/%04d%s", $dir, ++$i, $ext);
}
이 oneliner는 현재 디렉토리의 모든 파일을 나열하고 생성 타임 스탬프를 역순으로 정렬하며 (가장 오래된 파일이 시작됨을 의미) 파일 양에 필요한 후행 0으로 자동으로 이름을 바꿉니다. 파일 확장자가 유지됩니다.
나는 휴대 전화 사진과 영화를 위해 수년 동안 보통 하나의 폴더 만 가지고 있습니다. 이 명령을 적용하면 내 사진과 동영상이 TV 또는 보관에서 올바른 순서로 슬라이드 쇼를 준비합니다.
파일 이름 충돌이 발생하면 파일이 손실됩니다. 먼저 이상한 이름으로 바꾸고 temp001.jpg
최종 파일 이름으로 실행하십시오.
DIGITS=$(ls | wc -l | xargs | wc -c | xargs); ls -tcr | cat -n | while read n f; do mv "$f" "$(printf "%0${DIGITS}d" $n).${f##*.}"; done
ls
한 번이 아니라 두 번 실행 하면 피하는 것이 좋았지 만 깊이 연구하지 않았습니다.
ls
되므로 두 파일이 필요한 이유는 무엇입니까? 3. 이러한 명령은 원샷이며 스크립트에 포함되지 않기 때문에 사람들이 원 라이너를 선호하는 이유가 있습니다.
여기 나를 위해 일한 것이 있습니다. 파일 이름에 공백이 포함 된 경우 mv 명령이 공백과 실제 파일 사이에 혼동하지 않도록 rename 명령을
사용 했습니다 .
여기에서 모든 jpg 파일의 파일 이름에서 공백 ''을 '_'로 바꿨습니다.
#! / bin / bash 'y / / _ /'이름 바꾸기 * jpg # 공백을 _로 교체 x = 0으로하자; *의 경우 i.jpg; do x = (x + 1)하자 mv $ i $ x.jpg 끝난
이 스크립트는 Mac OS bash에서 생성 날짜별로 파일을 정렬합니다. 비디오를 대량으로 이름을 바꾸는 데 사용합니다. 확장명과 이름의 첫 부분 만 변경하면됩니다.
ls -trU *.mp4| awk 'BEGIN{ a=0 }{ printf "mv %s lecture_%03d.mp4\n", $0, a++ }' | bash
blahblah; rm -r * blahblah.mp4
어떻게합니까?
다음은 "이름 바꾸기"명령을 사용하는 다른 솔루션입니다.
find -name 'access.log.*.gz' | sort -Vr | rename 's/(\d+)/$1+1/ge'
rename 's/(\d+)/sprintf("%04d",$1)+1/ge'
Pero의 대답은 나를 여기로 데려 갔다 :)
이미지 뷰어가 이미지를 시간 순서대로 표시하지 않았기 때문에 시간에 따라 파일 이름을 바꾸고 싶었습니다.
ls -tr *.jpg | # list jpegs relative to time
gawk 'BEGIN{ a=1 }{ printf "mv %s %04d.jpg\n", $0, a++ }' | # build mv command
bash # run that command
blahblah; rm -r * blahblah.jpg
어떻게합니까? 극단적 인 예입니다.
이미지 레이블을 지정하기 위해 image Annotator를 사용하는 경우.
$ make qt5py3
$ python3 labelImg.py
한 폴더에있는 파일 6000 개를 다시 번호 매기기 위해 ACDsee 프로그램의 '이름 바꾸기'옵션을 사용할 수 있습니다.
접두사를 정의하려면 다음 형식을 사용하십시오. ####"*"
그런 다음 시작 번호를 설정하고 이름 바꾸기를 누르면 프로그램이 모든 6000 파일의 이름을 일련 번호로 바꿉니다.