ディレクトリ内のすべてのファイルの名前に数字を加算または減算します。

ディレクトリ内のすべてのファイルの名前に数字を加算または減算します。

pngたとえば、ディレクトリに数字とという名前のファイルがたくさんあります。jpg0100.png

  • 10002.pngたとえば、名前を上書きせずに別々に名前を追加するにはどうすればよいですか0003.png0001.png0002.png

  • 2名前にならないようにどうやって0100.png名前を引くべきですか?098.png0098.png

関連https://stackoverflow.com/questions/26770060/subtracting-a-number-from-the-names-of-all-the-files-in-a-directoryしかし、ここではもっと難しいです。

答え1

この場合、一時ディレクトリを使用することもできます。

for file in [[:digit:]]*.png; do
    echo mv $file tmp/$(printf %04d $((10#${file%.png}+1))).png
done

重要なのは、bashがこれをjustと10#N解釈するように強制することです。それ以外の場合、先行ゼロは8進数を表します。000NN

たとえば、

$ touch 0001.png 0002.png 0010.png 0020.png 0100.png 0200.png
$ for file in [[:digit:]]*.png; do echo mv $file tmp/$(printf %04d $((10#${file%.png}-1))).png; done
mv 0001.png tmp/0000.png
mv 0002.png tmp/0001.png
mv 0010.png tmp/0009.png
mv 0020.png tmp/0019.png
mv 0100.png tmp/0099.png
mv 0200.png tmp/0199.png

答え2

(1)溶液

ファイル番号でファイルを並べ替え、最も高い番号のファイルから名前を変更します。これにより競合が不可能になります。

ls *.png | sort -rn | while read ...; do ... mv ...; done

(2)の解決策

ビット数を決定し(ビット数がすべてのファイルに対して異なる場合)、その長さを維持するためにprintf使用します。

printf %04d.png 98
0098.png

答え3

パールを使うrename:

-2:

$ rename -n 's@\b\d+\b@sprintf("%04d", $& - 2)@e'  0100.png
0100.png -> 0098.png

+1:

$ rename -n 's@\b\d+\b@sprintf("%04d", $& + 1)@e'  0001.png 0002.png
0001.png -> 0002.png
0002.png -> 0003.png

-nテストが有効な場合は削除できます(模擬実行モードスイッチ)。

警告するこれを行うこともできないかもしれない同じ名前の他のツールがあるので注意してください。

次のコマンドを実行すると(linux

$ file $(readlink -f $(type -p rename))

この結果が出ました。

.../rename: Perl script, ASCII text executable

もしそうなら、これは正しいツールのようです=)

そうでない場合は、それをデフォルト値に設定し(通常はすでに適用されている)、Debian次のように派生しますUbuntu

$ sudo update-alternatives --set rename /path/to/rename

(コマンドのパスに置き換えます/path/to/renameperl's rename


このコマンドがない場合は、パッケージマネージャを検索してインストールするか、手動で行う


最後に、このツールはもともとPerlの父親であるLarry Wallによって書かれました。

関連情報