web-dev-qa-db-ja.com

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

次のような番号の付いた画像ファイルを含むディレクトリがあります。

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

異なる形式のファイルの複数のバージョンが存在する場合があります(例:pngおよびsvgバージョンの03および09上記のファイル)。ただし、番号は連続しています。通常、このようなファイルは各ディレクトリに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をインストールしています。

13
robertc

私はそれが仕事をするべきだと思います:

#!/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ディレクトリには、このように名前を付けたイメージのみを記述してください。

10
pbm

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

  • Onglob qualifier 一致を降順に並べ替えます(および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

より簡単に:

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

あなたは得るでしょう:

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

この正確な問題は この記事 で説明されています。 2番目のMVステップを追加して、SVGおよびPNG形式をサポートするように変更する必要があることに注意してください。

1
Jodie C

この質問に対する最近の関心はあまりないようですが、誰かがつまずいた場合、ここに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/ で説明しています

1
David McCracken