適切なソートのために一度に数百のファイルの名前を変更する


23

私は、すべての名前付きのものをファイルのトンを持っているよう1.jpg2.jpg3.jpg、などまでに1439.jpg、しかし、私は私のプロジェクトとアルファベット順に並べのいずれかに問題があります。これは通常の順序で行く1.jpg10.jpg11.jpgなどなど。

私が必要なのは、ファイルに名前を付ける00001.jpg方法01439.jpgです。

これを迅速かつ効率的に行うにはどうすればよいですか?


あなたが探していることは「自然のソート」で、多分これは役立ちます:askubuntu.com/questions/41390/...
ファビアンBlechschmidt

直接の答えではない答えですか?ls -v unix.stackexchange.com/questions/33909/...
WernerCD

+1で失敗しましたpyrenamer
パート

@FabianBlechschmidt、これはnautilusなどに対応していないプログラムで必要です。これは個々のプロジェクト用です。
カズウルフ

自然な並べ替えを実装することを考えたと思いますか?しかし、ファイルの名前を変更するのは非常に簡単で、うまくいけば素晴らしいです:)
Fabian Blechschmidt

回答:


35

Ubuntuには、というスクリプトが付属していますrename。多数の強力な一括名前変更機能を備えたほんの小さなPerlスクリプトですが、(この場合)最も良いのは、置換中にPerlを実行できることです。その結果、真にコンパクトなソリューションが得られます。

rename 's/\d+/sprintf("%05d", $&)/e' *.jpg

これは他のprintfスタイルの回答と似ていますが、すべて処理されます。上記のコードは、5桁の数字(可変数の先行ゼロを含む)用です。

見つかった最初の数値文字列を検索してゼロ詰めのバージョンに置き換え、ファイル名の残りの部分はそのままにします。これは、拡張機能やプレフィックスの持ち越しについて心配する必要がないことを意味します。

注:これは完全に移植可能ではありません。多くのディストリビューションはrename.ulutil-linuxパッケージからデフォルトのrenameバイナリとして使用します。これはman rename.ul、上記を理解できない、非常に発育不良の代替手段です(を参照)。Perlの名前変更を使用していないプラットフォームでこれが必要な場合は、最初にそれをインストールする方法を見つけてください。


次に、テストハーネスを示します。

$ touch {1..19}.jpg

$ ls
10.jpg  12.jpg  14.jpg  16.jpg  18.jpg  1.jpg  3.jpg  5.jpg  7.jpg  9.jpg
11.jpg  13.jpg  15.jpg  17.jpg  19.jpg  2.jpg  4.jpg  6.jpg  8.jpg

$ rename 's/\d+/sprintf("%05d", $&)/e' *.jpg

$ ls
00001.jpg  00005.jpg  00009.jpg  00013.jpg  00017.jpg
00002.jpg  00006.jpg  00010.jpg  00014.jpg  00018.jpg
00003.jpg  00007.jpg  00011.jpg  00015.jpg  00019.jpg
00004.jpg  00008.jpg  00012.jpg  00016.jpg

そして、接頭辞の例(私たちは何も変えていません):

$ touch track_{9..11}.mp3 && ls
track_10.mp3  track_11.mp3  track_9.mp3

$ rename 's/\d+/sprintf("%02d", $&)/e' *.mp3 && ls
track_09.mp3  track_10.mp3  track_11.mp3

もし私がPerlの人なら、これは完璧な解決策でしょう。本当にすてきです。
MGP

2
perlは使用せず、perlで既に記述されているツールを提供します。
ロブ

1
この場合、それ単一のPerlコマンドを含みますが、それは正確に重荷ではありません。sprintfPerl sprintfでは、他の言語と同様に動作します。
オリ

21
for f in *.jpg ; do if [[ $f =~ [0-9]+\. ]] ; then  mv $f `printf "%.5d" "${f%.*}"`.jpg  ; fi ; done

編集

説明:

  • if [[ $f =~ [0-9]+\. ]] 名前が数字(ドットが後に続く)であるファイルのみの名前が変更されるようにします。
  • printf "%.5d" NUMBER 先行ゼロを追加します
  • "${f%.*}" 拡張子(.jpg)を切り取り、数字だけを残す
  • .jpg2番目のバックティックがファイル拡張子を再度追加した後。

これは、数字であるファイル名でのみ機能することに注意してください。番号のないファイルに先行ゼロを左詰めすると、異なる形式が必要になります。

実験する場合は、次のコマンドを試してください。

for f in *.jpg ; do if [[ $f =~ [0-9]+\. ]] ; then echo mv $f `printf "%.5d" "${f%.*}"`.jpg  ; fi ; done

編集2

数字であるファイル名のみが名前変更されるようにすることで、コマンドをより安全にしました。00001.jpgのような名前の既存のファイルはすべて上書きされることに注意してください。


この1つのライナースクリプトは、Ubuntuおよびその他のLinuxディストリビューションで「そのまま」動作します!😃などPerlやPython、使用して、任意の追加のツールをインストールする必要はありません
HEXcube

6

Pythonスクリプトの下。

スクリプトは、定義された桁数まで先行ゼロを追加します。名前がそれよりも大きい場合、ファイル(名前)は変更されません。

さまざまな拡張子を1つの名前変更アクションに組み合わせると、便利になる場合があります。拡張機能を追加するには、単純にそれらをタプルに追加しますextensions = (".jpg", ".jpeg", ".tiff")

保存、空のファイルにテキストをコピーしrename.pyたファイルのディレクトリへの正しいパスを入力し、( sourcedir)、桁数は、あなたが(持っているために、新しい名前をたいnumber_ofdigits)とファイル拡張子(s)は(名前を変更しますextensions

次のコマンドで実行します:

python3 /path/to/script/rename.py

スクリプト:

#!/usr/bin/python3

import shutil
import os

sourcedir = "/path/to/files"; number_ofdigits = 5; extensions = (".jpg", ".jpeg")

files = os.listdir(sourcedir)
for item in files:
    if item.endswith(extensions):
        name = item.split("."); zeros = number_ofdigits-len(name[0])
        newname = str(zeros*"0")+name[0]+"."+name[1]
        shutil.move(sourcedir+"/"+item, sourcedir+"/"+newname)

編集:

わずかに改善されたバージョンの下。ディレクトリ内の最長の名前を自動的に決定し、最長の名前の長さまで先行ゼロを追加します。

例:

1.jpg
12.jpg
123.jpg

になる:

001.jpg
012.jpg
123.jpg

桁数を設定する必要はありません。

#!/usr/bin/python3

import shutil
import os

sourcedir = "/path/to/files"; extensions = (".jpg", ".jpeg")
files = [(f, f[f.rfind("."):], f[:f.rfind(".")]) for f in os.listdir(sourcedir)if f.endswith(extensions)]
maxlen = len(max([f[2] for f in files], key = len))

for item in files:
    zeros = maxlen-len(item[2])
    shutil.move(sourcedir+"/"+item[0], sourcedir+"/"+str(zeros*"0")+item[0])

2

これを非常に簡単にするPerlに実装された名前変更ユーティリティがあります。

rename 's/\d+/sprintf("%05d",$&)/e' *.jpg

最初の引数は、ファイル名ごとに評価されるPerl式です。


0

リポジトリにあるpyRenamerと呼ばれるこれを行うGUIがあります。インストール、開始、ディレクトリの選択、[パターン]タブで[名前を変更したファイル名のパターン]を[{num5}]に設定し、[名前の変更]ボタンをクリックします。名前を変更する前に何が起こるかをプレビューすることもできます。


あなたの答えはうまくshell-scriptingいきますが、これはセクションであることに注意してください。つまり、コマンドラインの答えを探しています。また、プログラムの詳細について教えてください。たとえば、パターンの形式は{num5}何ですか?
カズウルフ14

-4
for file in `(find * -maxdepth 1 -type f -name "*.jpg")`     
do    
  mv $file "000"$file    
done

名前の変更をインテリジェントに行わないため、これは粗野です。そのためのトリックを考える必要があります。しかし、それはあなたがものを分類するのを助けるべきです。

更新:まあ、あなたはより完全な答えを持っています。


2
1439.jpgの名前を0001439.jpgに変更します。
アビナッシュラジ

はい、私は知っています、ソートでまだ動作するはずの余分なゼロをパディングしました。
スワーネンドゥビスワ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.