ファイル名の数を増やしてファイル名を変更する

ファイル名の数を増やしてファイル名を変更する

次のように番号付けされたイメージファイルを含むディレクトリがあります。

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、数字は連続しています。通常、ディレクトリごとにこれらのファイルは40から80です。数字は、これらの画像が原稿(Word文書ですが重要ではありません)に表示される順序に対応します。画像の順序を決定する他の方法はありません。0309

原稿に新しい画像を追加する場合は、その画像のコピーを正しい番号でこのディレクトリに配置する必要があります。したがって、新しい画像が原稿の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をインストールしました。

答え1

私はそれが次のことを行うべきだと思います:

#!/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。イメージの外側にある別のディレクトリにスクリプトを配置します。イメージディレクトリには、説明されているように名前付きイメージのみが必要です。

答え2

これはzshでより簡単です。

  • これOn グローバル予選降順で一致をソートします(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

答え3

最近はこの問題にあまり興味がないようですが、もし偶然発見した人がいるなら、3つの質問を投げてみてください。

  • 1つは、意味論的基準に基づいて名前を変更するファイルを選択する方法です(範囲は語彙ではなく、ワイルドカードや正規表現としても指定できません。オートマトン理論ではこれをNFAよりも複雑であると見なします)。

  • 2つ目は、名前の一部を変更して名前を変更する方法です。

  • 3番目は名前の衝突を避ける方法です。

Bashや他の多くの言語のスクリプトはこれらの特定の変換を実行できますが、ほとんどの人は複数のファイルの名前を変更したいときはいつでもプログラムを書く必要はありません。

私(無料およびオープンソース)を使用すると、必要なことができrene.pyますが、名前の競合の問題を回避するには2回の呼び出しが必要です。

  1. 最初
    rene ?.*/#7-80  %?.* B
    
    %既存の名前を避けるために、プレフィックスを追加して範囲内のすべての名前を増やします。
  2. それから
    rene %* *
    
    そのプレフィックスがあるファイルからプレフィックスを削除します。

私はこれを説明しましたhttps://sourceforge.net/p/rene-file-renamer/discussion/examples/thread/f0fe8aa63c/

答え4

この正確な質問はこの記事。 2番目のMVステップを追加してSVGおよびPNG形式をサポートするように変更する必要があります。

関連情報