ファイル名内の数字を増やしてファイル名を変更します


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

時にはそこに複数の異なるフォーマットでファイルのバージョン(例えばかもしれpngsvgのバージョン0309ファイル以上)が、数字は、そうでない場合は連続しています。通常、このようなファイルは各ディレクトリに40〜80個あります。番号は、これらの画像が原稿(Word文書ですが、重要ではありません)に表示される順序に対応しています。画像の順序を決定する他の方法はありません。

新しい画像を原稿に追加する場合は、画像のコピーを正しい番号でこのディレクトリに配置する必要があります。そのため、新しい画像が原稿の5番目の画像である場合は、スペースを確保するために、ディレクトリ内のファイルの名前をこの名前に変更する必要があります。

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

スクリプトは1つのパラメーター(新しい画像の数)を取ります。

PS。スクリプトを画像とは別のディレクトリに置きます。imagesディレクトリには、このように名前を付けたイメージのみを記述してください。


これは有望に見えます。ラップトップに戻ってから数時間で試してみます。
robertc

これは、ファイル名の先頭に数字以外の文字が付いていない場合にのみ機能します
mems

@mems OPは、ファイル名が数字で始まることを明確に述べています
xhienne

2

これはzshで簡単に使用できます。

  • 一致を降順でソートするためのOn glob修飾子(およびnファイル名のすべてに同じ幅の先行ゼロがない場合に備えて、番号順を使用)。
  • (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

この正確な問題については、この記事で説明します。2番目の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の先行ゼロをどのように追加しますか?また、03.pngと03.svgの2つのファイルがあることも覚えておいてください。
robertc

1

この質問に対する最近の関心はあまりないようですが、誰かがそれにつまずいた場合、ここに3つの問題があります。1つは、セマンティック基準に基づいて名前を変更するファイルを選択する方法です(範囲は語彙ではなく、ワイルドカードや正規表現でも指定できません。オートマトン理論では、これはNFAよりも複雑であるとされています)。2つ目は、名前の一部を変更して名前を変更する方法です。3つ目は、名前の衝突を回避する方法です。Bashや他の多くの言語のスクリプトでこの特定の変換を行うことができますが、ほとんどの場合、一連のファイルの名前を変更するたびにプログラムを記述する必要はありません。私の(フリーでオープンソースの)rene.pyを使用すると、必要なことを実行できますが、名前の衝突の問題を回避するには、2回の呼び出しが必要です。最初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.