파일 확장자 수를 1씩 늘리는 방법

파일 확장자 수를 1씩 늘리는 방법

다음 현재 폴더 아래에 파일 예제가 있습니다.

lok.log.1
df.log.6
weq.log.90
vr.log.11
vs.aw.frsd.log.3

파일 확장자를 1씩 늘리고 싶습니다.

따라서 예상 출력은 다음과 같습니다.

lok.log.2
df.log.7
weq.log.91
vr.log.12
vs.aw.frsd.log.4

찾기 및 정규식을 사용하여 파일 이름을 바꾸는 방법을 제안하십시오.

  • 개념은 ".log"가 있는 모든 파일의 이름이 +1로 변경된다는 것입니다.

답변1

그리고 zsh:

autoload zmv # best in ~/.zshrc
zmv -n -f '(*.log.)(<->)(#qnOn)' '$1$(($2+1))'

-n(결과가 만족스러우면 삭제하세요)

  • <->임의의 십진수와 일치합니다.
  • (#qnOn)nOn여기서 :glob 한정자는 파일 목록을 이름()별로 역순으로 정렬하므로 이름을 바꾸기 전에 이름 file.log.2을 바꾸세요 .file.log.3file.log.1file.log.2.정기적인파일(그러나 숨겨진 파일의 이름도 바꾸려면 -o-nTGNU 를 가정하는 옵션을 추가할 수 있습니다 mv).D
  • -f비활성화하면 파일 이름이 기존 파일로 바뀔 때 명령에서 보호가 제거되어 위의 예를 방해하게 됩니다 file.log.1. file.log.2여전히 두 가지 모두로부터 보호하며 foo.log.1이름 foo.log.01foo.log.2.

재귀적으로:

zmv -n -f '(**/)(*.log.)(<->)(#qnOn)' '$1$2$(($3+1))'

또는 또는 :bashshksh

zsh << 'EOF'
autoload zmv
zmv -n -f '(*.log.)(<->)(#qnOn)' '$1$(($2+1))'
EOF

bashusing 사용 여부에 관계없이 GNU 및 GNU가 zsh있고 파일 목록이 너무 크지 않으면 다음을 수행할 수 있습니다.lsmv

shopt -s failglob
shopt -s extglob
export LC_ALL=C
eval "files=($(
  ls --quoting-style=shell-always -rvd -- *.log.+([[:digit:]])))"
for f in "${files[@]}"; do
   echo mv -nT -- "$f" "${f%.*}.$((10#${f##*.} + 1))"
done

(만족하면 제거 echo).

일반 파일에 대해서만 GNU bash, GNU find, GNU mv및 GNU 를 재귀적으로 사용합니다.sort

export LC_ALL=C
while IFS= read -rd '' -u3 file; do
  echo mv -nT "$file" "${file%.*}.$((10#${file##*.} + 1))"
done 3< <(
  find . -name '.?*' -prune -o -regex '.*\.log\.[0-9]+' -type f -print0 |
    sort -rzV)

mv -n-T기존 파일이 손상되는 것을 방지하고 파일 간의 모호성을 제거하기 위한 GNU 확장입니다.이동하다그리고이사 오다그렇지 않으면 mv영향을 받게 됩니다. 그러나 어떤 이유로 파일 이름이 바뀌지 않으면 -n관련 오류가 발생하지 않는다는 점에 유의하세요.

답변2

rename기반 - 산술 사용 허용(일부 배포판에서는 이 이름 바꾸기 도구의 이름을 사용함 perl):prenameperl

rename 's/(log.)([0-9]+)$/$1.($2+1)/e' <files>

find와 함께 사용하려면 다음을 사용하십시오.

find <search options> -exec rename 's/(log.)([0-9]+)$/$1.($2+1)/e' {} +

Stéphane의 의견을 따라 편집하십시오.

정렬되지 않은 출력은 find실제로 문제를 일으킬 수 있으므로 미리 정렬하는 것이 좋습니다. 주어진 이름 패턴에 대해 버전 번호 매기기 옵션을 사용하여 역방향(!) 정렬을 사용할 수 있습니다.

find <search parpameters> -print0 |\
   sort -rzV |\
   xargs -r0 rename 's/(log.)([0-9]+)$/$1.($2+1)/e'

관련 정보