파일 이름 내에서 숫자를 증가시켜 파일 이름을 바꿉니다.


14

번호가 지정된 이미지 파일이 들어있는 디렉토리가 있습니다.

01.png
02.png
03.png
03.svg
04.png
05.png
06.jpg
07.png
08.png
09.png
09.svg
10.png

때로는 다른 형식 (예 : a pngsvg버전 0309위의 파일)의 여러 버전의 파일이있을 수 있지만 숫자가 연속적입니다. 일반적으로 각 디렉토리에는 40-80 개의 해당 파일이 있습니다. 숫자는이 이미지가 원고 (Word 문서)에 나타나는 순서에 해당하지만 중요하지는 않습니다. 이미지의 순서를 결정하는 다른 방법은 없습니다.

원고에 새 이미지를 추가하면 올바른 번호가 매겨진이 디렉토리에 이미지 사본을 배치해야합니다. 따라서 새 이미지가 원고에서 다섯 번째 인 경우 공간을 확보하기 위해 디렉토리의 파일 이름을 다음과 같이 변경해야합니다.

01.png
02.png
03.png
03.svg
04.png
06.png
07.jpg
08.png
09.png
10.png
10.svg
11.png

명령 줄이나 스크립트 또는 매크로에서 특정 번호부터 시작하여 모든 파일의 번호를 다시 지정하는 가장 간단한 방법은 무엇입니까? bash를 사용하여 표준 Fedora Linux를 설치했습니다.

답변:


11

나는 그것이 일을해야한다고 생각합니다.

#!/bin/bash

NEWFILE=$1

for file in `ls|sort -g -r`
do
    filename=$(basename "$file")
    extension=${filename##*.}
    filename=${filename%.*}

    if [ $filename -ge $NEWFILE ]
    then
        mv "$file" "$(($filename + 1))".$extension
    fi
done

스크립트는 하나의 매개 변수-새 이미지 수를 사용합니다.

추신. 이미지가 아닌 다른 디렉토리에 스크립트를 넣으십시오. 이미지 디렉토리에는 설명 된 방식으로 이름이 지정된 이미지 만 있어야합니다.


이것은 유망한 것으로 보입니다. 랩톱으로 돌아 오면 몇 시간 후에 시도해 보겠습니다.
robertc

파일 이름 앞에 숫자가 아닌 문자가
붙지

@mems 영업 이익은 명확하게 파일 이름이 숫자로 시작한다고
xhienne

2

이것은 zsh에서 더 쉬울 것입니다.

  • 일치하는 항목을 내림차순으로 정렬 하는 On glob 한정자 ( n파일 이름이 모두 같은 너비의 앞에 0이없는 경우 숫자 순서를 사용)
  • (l:WIDTH::FILLER:) 파라미터 확장 플래그 패드와 동일한 폭 (더 큰 수의 폭)에 대한 모든 번호.
break=$1   # the position at which you want to insert a file
setopt extended_glob
width=
for x in [0-9]*(nOn); do
  n=${x%%[^0-9]*}
  if ((n < break)); then break; fi
  ((++n))
  [[ -n $width ]] || width=${#n}
  mv $x ${(l:$width::0:)n}${x##${x%%[^0-9]*}}
done

bash에는 파일이 고정 너비로 ​​채워지고 (그렇지 않으면 스크립트가 올바른 파일 이름을 바꾸지 않음) 고정 너비로 ​​지정되는 스크립트가 있습니다 (지정해야 함).

break=$1      # the position at which you want to insert a file
width=9999    # the number of digits to pad numbers to
files=([0-9]*)
for ((i=#((${#files}-1)); i>=0; --i)); do
  n=${x%%[^0-9]*}
  x=${files[$i]}
  if ((n < break)); then continue; fi
  n=$((n + 1 + width + 1)); n=${n#1}
  mv -- "${files[$i]}" "$n${x##${x%%[^0-9]*}}"
done

1

이 정확한 문제는 이 기사 에서 다룹니다 . 두 번째 MV 단계를 추가하여 SVG 및 PNG 형식을 지원하도록 수정해야합니다.


나는 그것이 정확한 문제라고 생각하지 않으며, 매번 모든 이미지의 번호를 다시 매길 것입니다. 특정 지점에서 이미지 번호를 다시 지정하고 싶습니다.
robertc

1

더 쉬움 :

touch file`ls file* | wc -l`.ext

당신은 얻을 것이다:

$ ls file*
file0.ext  file1.ext  file2.ext  file3.ext  file4.ext  file5.ext  file6.ext

1-9에 선행 0을 어떻게 추가합니까? 또한 03.png와 03.svg라는 두 파일이있을 수 있습니다.
robertc

1

이 질문에 대해서는 최근에 관심이없는 것 같지만 누군가이 질문에 걸려 넘어지면 여기에는 세 가지 문제가 있습니다. 하나는 시맨틱 기준에 따라 이름을 바꿀 파일을 선택하는 방법입니다 (범위는 어휘 적이 지 않으며 와일드 카드 나 정규 표현식으로 지정할 수 없습니다). 두 번째는 이름의 일부를 수정하여 이름을 변경하는 방법입니다. 세 번째는 이름 충돌을 피하는 방법입니다. Bash와 다른 많은 언어의 스크립트는 이러한 특정 변환을 수행 할 수 있지만 대부분의 파일 이름을 바꿀 때마다 프로그램을 작성할 필요가 없습니다. 내 (무료 및 오픈 소스) rene.py를 사용하면 원하는 것을 할 수 있지만 이름 충돌 문제를 피하려면 두 번의 호출이 필요합니다. 먼저rene ?.*/#7-80 %?.* B기존 이름을 피하기 위해 접두사 %를 추가하여 범위의 모든 이름을 증가시킵니다. 그런 다음 rene %* *접두사가있는 파일에서이 접 두부를 제거합니다. 나는 이것을 https://sourceforge.net/p/rene-file-renamer/discussion/examples/thread/f0fe8aa63c/ 에서 설명합니다.

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