png
たとえば、ディレクトリに数字とという名前のファイルがたくさんあります。jpg
0100.png
1
0002.png
たとえば、名前を上書きせずに別々に名前を追加するにはどうすればよいですか0003.png
?0001.png
0002.png
2
名前にならないようにどうやって0100.png
名前を引くべきですか?098.png
0098.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進数を表します。000N
N
たとえば、
$ 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/rename
。perl's rename
このコマンドがない場合は、パッケージマネージャを検索してインストールするか、手動で行う
最後に、このツールはもともとPerlの父親であるLarry Wallによって書かれました。