code

폴더의 파일 이름을 순차 번호로 변경

starcafe 2023. 5. 3. 21:36
반응형

폴더의 파일 이름을 순차 번호로 변경

디렉터리에 있는 파일의 이름을 순차적인 번호로 변경합니다.파일 생성 날짜를 기준으로 합니다.

: 예들면sadf.jpg0001.jpg,wrjr3.jpg0002.jpg파일의 총 양에 따라 선행 0의 수(필요하지 않은 경우 추가 0이 필요하지 않음).

한 줄의 아름다움:

ls -v | cat -n | while read n f; do mv -n "$f" "$n.ext"; done 

을 변경할 수 ..ext와 함께.png,.jpg 타기.

루프를 사용해 보세요.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파일을 으로 덮어쓰는 하며, 플그는기파자덮로동어는쓰것사다을니용방합을 사용합니다.-- 예방합니다.mv대시가 있는 파일 이름을 옵션으로 해석합니다.

저는 단순성 때문에 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

항목 수를 세고 명령을 빌드하기 위해 가우크를 사용했습니다.하지만 주요 차이점에 주목하세요.기본적으로find하위 을 제한해야 (" 현재디와사로므", "검하색에서만검오리시제십색하한용을디현경렉" 사용).man find방법을 확인합니다.

원래 확장자를 유지하고 선행 0을 추가하며 OSX에서도 작동하는 매우 간단한 bash one 라이너:

num=0; for i in *; do mv "$i" "$(printf '%04d' $num).${i#*.}"; ((num++)); done

http://ubuntuforums.org/showthread.php?t=1355021 의 단순화된 버전

OSX에서 페로의 솔루션을 사용하려면 약간의 수정이 필요했습니다.사용:

find . -name '*.jpg' \
| awk 'BEGIN{ a=0 }{ printf "mv \"%s\" %04d.jpg\n", $0, a++ }' \
| bash

참고: 백슬래시는 라인 계속을 위해 있습니다.

2015년 7월 20일 편집: @klaustoper의 피드백을 인용하기 위해 통합되었습니다.\"%s\"mv공백이 있는 파일 이름을 지원하는 명령입니다.

"command" 명령을 사용하여

rename -N 0001 -X 's/.*/$N/' *.jpg

또는

rename -N 0001 's/.*/$N.jpg/' *.jpg

모든 상황에서 작업하려면 이름에 공백이 있는 파일의 경우 \"를 입력합니다.

find . -name '*.jpg' | gawk 'BEGIN{ a=1 }{ printf "mv \"%s\" %04d.jpg\n", $0, a++ }' | bash

OSX에서 Homebrew에서 이름 바꾸기 스크립트를 설치합니다.

brew install rename

그러면 정말 터무니없이 쉽게 할 수 있습니다.

rename -e 's/.*/$N.jpg/' *.jpg

또는 적절한 접두사를 추가하려면:

rename -e 's/.*/photo-$N.jpg/' *.jpg

메모 에는 여서이바꾸명다같습다니음과가 포함됩니다.-n이름을 미리 볼 수 있습니다.바꾸기를 하려면 이변경실수다제음다거니합을면려행하제로름을을 합니다.-n

만약 당신이rename하지 -N다음과 같은 작업을 수행할 수 있습니다.

ls -1 --color=never -c | xargs rename -n 's/.*/our $i; sprintf("%04d.jpg", $i++)/e'

메모 여기서 이름 바꾸기 명령에는 다음이 포함됩니다.-n이름을 미리 볼 수 있습니다.바꾸기를 하려면 이변경실수다제음다거니합을면려행하제로름을을 합니다.-n

편집 지정된 숫자로 시작하려면 아래의 (약간 보기 흉한) 코드를 사용할 수 있습니다. 123을 원하는 숫자로 바꾸기만 하면 됩니다.

ls -1 --color=never  -c | xargs rename -n 's/.*/our $i; if(!$i) { $i=123; } sprintf("%04d.jpg", $i++)/e'

은 작성 시간 시간, 시간) 합니다.-rtools to reverse sort)를 선택한 다음 이름을 바꿀 파일 목록을 보냅니다.이름 바꾸기는 정규식의 펄 코드를 사용하여 카운터를 포맷하고 증분합니다.

하지만 EXIF 정보가 있는 JPEG 이미지를 다루는 경우에는exiftool

이는 "예명 변경"에 있는 exift 도구 설명서의 내용입니다.

   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 --counter-format 000001 --lower-case --keep-extension --expr='$_ = "$N" if @EXT' *
find .  | grep 'avi' | nl -nrz -w3 -v1 | while read n f; do mv "$f" "$n.avi"; done

find .폴더 및 하위 폴더에 있는 모든 파일을 표시합니다.

grep 'avi'.vi 에서 .

nl -nrz -w3 -v1이름으로 표시합니다.001002 파일 이름 다음에 표시합니다.

while read n f; do mv "$f" "$n.avi"; done파일 이름을 시퀀스 번호로 변경합니다.

https://www.cloudsavvyit.com/8254/how-to-bulk-rename-files-to-numeric-file-names-in-linux/ 에 대한 기사를 쓰기 위해 이 솔루션을 개발하는 데 3-4시간이 걸렸습니다.

if [ ! -r _e -a ! -r _c ]; then echo 'pdf' > _e; echo 1 > _c ;find . -name "*.$(cat _e)" -print0 | xargs -0 -t -I{} bash -c 'mv -n "{}" $(cat _c).$(cat _e);echo $[ $(cat _c) + 1 ] > _c'; rm -f _e _c; fi

은 올바른 이올른스파이일름에형식(공백, 특수 를 이름 문자)에합니다.\0 가지 find그리고.xargs할 수 .echo 1당신이 원한다면 다른 번호로.

시 (시작시확설정장설(정()pdf.또한 기존 파일을 덮어쓰지 않습니다.

이러한 파일이 생성된 순서대로 나열된 디렉토리에 있다고 가정합니다. 첫 번째 파일은 가장 오래된 파일입니다.

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)

확장자가 없는 파일에 대해 "초기화되지 않은 값 […] 사용" 경고가 표시되므로 무시할 수 있습니다.

제다한을 합니다.-nrename이름 변경을 실제로 적용하는 명령입니다.

이 대답은 2014년 4월의 Luke의 대답에서 영감을 받았습니다.총 파일 양에 따라 선행 0의 수를 설정해야 하는 Gnutt의 요구 사항을 무시합니다.

저도 비슷한 문제가 있었고 그 이유로 셸 스크립트를 작성했습니다.이미 좋은 답변들이 많이 올라왔음에도 불구하고 누군가에게 도움이 될 수 있다고 생각해서 올리기로 했습니다.자유롭게 개선하세요!

숫자를 매기다

@Gnutt 다음을 입력하여 원하는 동작을 수행할 수 있습니다.

./numerate.sh -d <path to directory> -o modtime -L 4 -b <startnumber> -r

선택사항인 경우-r제외됩니다. 리밍은 시뮬레이션만 수행됩니다(테스트에 도움이 될 것입니다).

옵션 L은 대상 번호의 길이를 설명합니다( 선행 0으로 채워짐). 옵션을 사용하여 접두사/접미사를 추가할 수도 있습니다.-p <prefix> -s <suffix>.

, 하세요.-o modtime선택.

a=1

for i in *.jpg; do
 mv -- "$i" "$a.jpg"
 a=`expr $a + 1`
done

페로의 솔루션을 거의 수정하지 않고 다시 사용하는 이유는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 

대부분의 다른 솔루션은 이미 번호로 명명된 기존 파일을 덮어씁니다.이 문제는 스크립트를 실행하고 파일을 추가한 다음 스크립트를 다시 실행하는 경우에 특히 발생합니다.

이 스크립트는 기존 숫자 파일의 이름을 먼저 바꿉니다.

#!/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); 
}

시간별로 정렬, jpg로 제한, 선행 0 및 기본 이름(원하는 경우):

ls -t *.jpg | cat -n |                                           \
while read n f; do mv "$f" "$(printf thumb_%04d.jpg $n)"; done

로, (모두한줄로없, 이▁the이,▁() 없이)\)

작성 날짜와 관련이 없지만 정렬된 이름을 기준으로 번호가 매겨집니다.

python3 -c \
'ext="jpg"
start_num=0
pad=4
import os,glob
files=glob.glob(f"*.{ext}")
files.sort()
renames=list(zip(files,range(start_num,len(files)+start_num)))
for r in renames:
  oname=r[0]
  nname=f"{r[1]:0{pad}}.{ext}"
  print(oname,"->",nname)
  os.rename(oname,nname)
'

이 스크립트는 Mac OS bash의 생성 날짜별로 파일을 정렬합니다.동영상 이름을 대량으로 바꾸는 데 사용합니다.이름의 확장자와 첫 번째 부분만 변경하면 됩니다.

ls -trU *.mp4| awk 'BEGIN{ a=0 }{ printf "mv %s lecture_%03d.mp4\n", $0, a++ }' | bash
ls -1tr | rename -vn 's/.*/our $i;if(!$i){$i=1;} sprintf("%04d.jpg", $i++)/e'

rename -vn - off 테스트 모드의 경우 remove n

{$i=1;} - 제어 시작 번호

"%04d.jpg" - 제어 카운트 004 및 출력 확장자 설정.jpg

저는 이 답변들의 조합이 완벽하게 작동했습니다.

ls -v | gawk 'BEGIN{ a=1 }{ printf "mv %s %04d.jpg\n", $0, a++ }' | bash
  • ls -v데 순서, JPG jpeg1109 파일 , jpg JPG jpeg.1910 파일 확장자 문제 방지
  • gawk 'BEGIN{ a=1 }{ printf "mv %s %04d.jpg\n", $0, a++ }'4개의 문자와 선행 0으로 이루어진 숫자입니다.MV를 피함으로써 실수로 같은 번호를 가진 것으로 이미 존재하는 것을 덮어쓰려고 하지 않습니다.
  • bash 실행합니다.

@xihienne이 말한 바에 유의하십시오. 알 수 없는 내용을 bash로 전송하는 것은 보안 위험입니다.하지만 스캔한 사진을 사용하고 있었기 때문에 저는 그렇지 않았습니다.

여기 제게 효과가 있었던 것이 있습니다.
파일 이름에 공백이 포함된 파일이 있으면 mv 명령어가 공백과 실제 파일을 혼동하지 않도록 이름 바꾸기 명령어사용했습니다.

여기서 나는 모든 jpg 파일에 대해 파일 이름의 ' '를 '_'로 공백을 바꿉니다.
/bin/continue'y/ /_/' *jpg #공백을 _로 변경합니다.let x=0;i의 경우(*.jpg;do)let x=(x+1)mv $i $x.jpg다 했어요.

요즘에는 이름을 바꾸기 위해 여러 파일을 선택한 후에 옵션이 있습니다(저는 tunar 파일 관리자에서 보았습니다).

  1. 여러 파일 선택
  2. 선택사항 확인
  3. 이름 바꾸기 선택

카테고리 섹션에서 해당 dir에 있는 모든 파일을 확인하라는 메시지가 표시됩니다.

sed 사용:

ls -tr | sed "s/(.*)/mv '\1' \=printf('%04s',line('.').jpg)/" > rename.sh
bash rename.sh

이렇게 하면 스크립트를 실행하기 전에 확인하여 큰 실수를 방지할 수 있습니다.

여기 "이름 바꾸기" 명령을 사용하는 다른 솔루션이 있습니다.

find -name 'access.log.*.gz' | sort -Vr | rename 's/(\d+)/$1+1/ge'

페로의 대답이 나를 여기에 오게 했습니다 :)

이미지 뷰어가 시간 순서대로 이미지를 표시하지 않기 때문에 시간에 따라 파일 이름을 바꾸고 싶었습니다.

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

번호 6000을 변경하려면 ACD 프로그램의 '이름 변경' 옵션을 사용할 수 있습니다.

하려면 다음합니다.####"*"

그런 다음 시작 번호를 설정하고 Rename을 누르면 프로그램이 모든 6000개 파일의 이름을 순차적으로 변경합니다.

언급URL : https://stackoverflow.com/questions/3211595/renaming-files-in-a-folder-to-sequential-numbers

반응형