ファイルの一括名前変更


25

私はいくつかのファイルを持っています:

10.3.100.179_01_20161018_230014_5335.jpg
10.3.100.179_01_20161018_231514_0814.jpg
10.3.100.179_01_20161018_233014_5706.jpg
10.3.100.179_01_20161018_234514_0896.jpg
10.3.100.179_01_20161018_230114_5395.jpg
10.3.100.179_01_20161018_231614_1145.jpg
10.3.100.179_01_20161018_233114_6047.jpg
10.3.100.179_01_20161018_234614_0547.jpg
10.3.100.179_01_20161018_230114_5492.jpg
10.3.100.179_01_20161018_231614_1264.jpg
10.3.100.179_01_20161018_233114_6146.jpg
10.3.100.179_01_20161018_234614_0658.jpg
10.3.100.179_01_20161018_230214_5630.jpg
10.3.100.179_01_20161018_231714_7135.jpg

この形式で名前を変更したい:

10.4.100.135_01_20161013131108389_TIMING.jpg
10.4.100.135_01_20161013131111390_TIMING.jpg
10.4.100.135_01_20161013131114401_TIMING.jpg
10.4.100.135_01_20161013131117431_TIMING.jpg
10.4.100.135_01_20161013131120418_TIMING.jpg
10.4.100.135_01_20161013131123461_TIMING.jpg
10.4.100.135_01_20161013131126511_TIMING.jpg

_inタイムスタンプを削除し、を追加する必要があります_TIMING



5
質問には一貫した例を使用してください。置き換えたいように見えます10.3.100.17910.4.100.135。それはあなたが望むものであるか、あなただけ削除したいん_TIMING_時間から?
テルドン

3
日付のiso8601標準(ファイル名とログエントリの両方で機能する)があることを人々に思い出させる良い機会です^^したがって、名前の変更を再検討する必要があるかもしれません:YYYY-MM-DDThh:mm:ss.mmm(ex :最初のファイルは次のようになります:( 10.4.100.135_01_2016-10-13T13:11:08.389_TIMING.jpgそして「TIMING」は、特に標準が広く普及したときに、日付と時間(およびミリ秒)のように見えるため、削除することもできます。Tは標準の一部であり、I好きになった(そしてそれを取り除くと標準が破られる^^)
オリビエデュラック

@OlivierDulac :ファイル名に使用することはお勧めしません。Windowsはそれをサポートしていないと思います。
ジャスティン

@ジャスティン良い点。標準では、ファイル名にドロップすることを推奨しています。私は、中にファイルバージョン与えた
オリヴィエ・デュラック

回答:


38

お気に入りのテキストエディターをインストールrenameutilsして使用qmvします。

qmvすべての名前をエディターにロードし、保存して閉じると、実際のファイルに変更が適用されます。変更が一貫していない場合(2つのファイルに同じ名前が付けられるなど)、何も変更せずに中断します。また、循環リネームを正しく処理します。

私は通常:

$ qmv -f do

そのため、名前の列が1列だけ表示されます(do:宛先のみ)。外観は次のとおりです。

qmw

SublimeText、Atom、またはVisual Studio Codeの複数のカーソルと組み合わせると、一括名前変更のための非常に優れた強力なツールになります。たとえば、Atomの場合、次のようにしますEDITOR="atom -w" qmv -f do


1
askUbuntuへようこそ!これはとてもクールです!
αғsнιη

+だけに署名しました!それ。;)
J.アラン

2
うわー、素敵なツールと素敵なGIFアニメーション。素晴らしい最初の答え、歓迎されます!:)
バイトコマンダー

1
画像をインライン化してくれた@KasiyAに感謝し、肯定的なコメントをありがとう。
-ateijelo

1
@kasperdはい、名前変更計画にエラーが含まれていることを警告し、さらにアクションを実行できる対話型コンソールを開きます。
ateijelo

27

使用するrename...

rename -n 's/^([0-9]+\.[0-9]\.[0-9]+\.[0-9]+_[0-9]+_)([0-9]+)_([0-9]+)_([0-9]+)\.jpg/$1$2$3$4_TIMING\.jpg/' *

これにより-n、変更を加えずに何をするかが出力されます:

rename(10.3.100.179_01_20161018_230014_5335.jpg, 10.3.100.179_01_201610182300145335_TIMING.jpg)
rename(10.3.100.179_01_20161018_231514_0814.jpg, 10.3.100.179_01_201610182315140814_TIMING.jpg)
rename(10.3.100.179_01_20161018_233014_5706.jpg, 10.3.100.179_01_201610182330145706_TIMING.jpg)
rename(10.3.100.179_01_20161018_234514_0896.jpg, 10.3.100.179_01_201610182345140896_TIMING.jpg)

正しく見える場合は、削除します -n

$ rename 's/^([0-9]+\.[0-9]\.[0-9]+\.[0-9]+_[0-9]+_)([0-9]+)_([0-9]+)_([0-9]+)\.jpg/$1$2$3$4_TIMING\.jpg/' *
$ ls
10.3.100.179_01_201610182300145335_TIMING.jpg  10.3.100.179_01_201610182330145706_TIMING.jpg
10.3.100.179_01_201610182315140814_TIMING.jpg  10.3.100.179_01_201610182345140896_TIMING.jpg

説明しています...

  • s/something/something_else/ 検索と置換
  • ^ 名前の始まり(アンカー)
  • [0-9] いずれかの番号
  • + 先行するキャラクターの1つ以上
  • \.リテラル.\これがないと、任意の文字に一致します)
  • () この部分を保つために
  • $1$2$3$3 以前に一致して保持されたものへの後方参照 ()

注:*コマンドの最後にあるのは、現在のディレクトリ内のすべての表示ファイルと一致しています。必要に応じて、より適切なグロブを使用します。


2
一部のディストリビューションでは、このコマンドはprename(最初のargはperl式であるため、perlのp)
Peter Cordes

12

mmv 次のようにそれを行うことができます:

mmv '*_*_*_*_*.jpg' '#1_#2_#3#4#5_TIMING.jpg'

10.3.100.179_01_20161018_230014_5335.jpg 10.3.100.179_01_201610182300145335_TIMING.jpg

#1、#2、#3、...は、ここで一致する「*」を参照しています。

次の場合はさらに短くなります。

mmv '*_*_*.jpg' '#1#2#3_TIMING.jpg'

9

別のrenameアプローチ:

$ rename -n 's/(.*)_(.*)_(.*)\./$1$2$3_TIMING./' *
10.3.100.179_01_20161018_230014_5335.jpg -> 10.3.100.179_01_201610182300145335_TIMING.jpg
10.3.100.179_01_20161018_230114_5395.jpg -> 10.3.100.179_01_201610182301145395_TIMING.jpg
10.3.100.179_01_20161018_230114_5492.jpg -> 10.3.100.179_01_201610182301145492_TIMING.jpg
10.3.100.179_01_20161018_230214_5630.jpg -> 10.3.100.179_01_201610182302145630_TIMING.jpg
10.3.100.179_01_20161018_231514_0814.jpg -> 10.3.100.179_01_201610182315140814_TIMING.jpg
10.3.100.179_01_20161018_231614_1145.jpg -> 10.3.100.179_01_201610182316141145_TIMING.jpg
10.3.100.179_01_20161018_231614_1264.jpg -> 10.3.100.179_01_201610182316141264_TIMING.jpg
10.3.100.179_01_20161018_231714_7135.jpg -> 10.3.100.179_01_201610182317147135_TIMING.jpg
10.3.100.179_01_20161018_233014_5706.jpg -> 10.3.100.179_01_201610182330145706_TIMING.jpg
10.3.100.179_01_20161018_233114_6047.jpg -> 10.3.100.179_01_201610182331146047_TIMING.jpg
10.3.100.179_01_20161018_233114_6146.jpg -> 10.3.100.179_01_201610182331146146_TIMING.jpg
10.3.100.179_01_20161018_234514_0896.jpg -> 10.3.100.179_01_201610182345140896_TIMING.jpg
10.3.100.179_01_20161018_234614_0547.jpg -> 10.3.100.179_01_201610182346140547_TIMING.jpg
10.3.100.179_01_20161018_234614_0658.jpg -> 10.3.100.179_01_201610182346140658_TIMING.jpg

望みどおりに機能するようであれば、を削除し-nます。


5

以下も使用できます。最初にファイルのバックアップを取り、これを試してください:

find . -name "*.jpg" -type f -print0| while read -d $'\0' file
do
    #extension="${file##*.}"
    newfilename=$(echo "${file%.*}" | sed 's/\(.*\)_\(.*\)_/\1\2/')
    mv "$file" "$newfilename""_TIMING.jpg"
done

sed 's/\(.*\)_\(.*\)_/\1\2/')_タイムスタンプの文字を削除します。

例えば:

user@host$ ls -lart
total 8
drwxrwxr-x 6 user user 4096 Oct 21 10:21 ..
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_230014_5335.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_231514_0814.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_233014_5706.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_234514_0896.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_230114_5395.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_231614_1145.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_233114_6047.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_234614_0547.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_230114_5492.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_231614_1264.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_233114_6146.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_234614_0658.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_230214_5630.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_231714_7135.jpg
drwxrwxr-x 2 user user 4096 Oct 21 10:30 .

user@host$ find . -name "*.jpg" -type f -print0 | while read -d $'\0' file
> do
>  newfilename=$(echo "${file%.*}" | sed 's/\(.*\)_\(.*\)_/\1\2/')
>  mv $file $newfilename"_TIMING.jpg"
> done

10:35:20 t $ ls -lart
total 8
drwxrwxr-x 6 user user 4096 Oct 21 10:21 ..
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_201610182300145335_TIMING.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_201610182315140814_TIMING.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_201610182330145706_TIMING.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_201610182345140896_TIMING.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_201610182301145395_TIMING.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_201610182316141145_TIMING.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_201610182331146047_TIMING.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_201610182346140547_TIMING.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_201610182301145492_TIMING.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_201610182316141264_TIMING.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_201610182331146146_TIMING.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_201610182346140658_TIMING.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_201610182302145630_TIMING.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_201610182317147135_TIMING.jpg
drwxrwxr-x 2 user user 4096 Oct 21 10:35 .

1
これが最善の解決策です。もちろん、Zannaのsoultionはいくつかのファイルに最適ですが、グロビングはシェルによって実行されるため、それらのソリューションは多数のファイルで失敗する可能性があります(コマンド文字列が長すぎます)。
rexkogitans

@rexkogitans:最新のLinuxシステム(つまり、Ubuntuの任意のバージョン)を使用している場合、コマンドラインの長さの制限は数メガバイトです。また、問題がある場合find -maxdepth 1 -exec rename ... {} +は、現在のディレクトリのリストを名前変更のコマンドラインにバッチ処理するために使用できます。(追加する-name *.jpgか、必要なものは何でも)。これは、シェルのループよりもはるかに高速に実行すること+幹部フォークsedmvだけではなく、名前の変更、システムコールのすべてのファイル名の、。(sedbashに組み込まれている正規表現を使用することはできませんが、フォークmvはまだ遅いようです。)
Peter Cordes

2

おそらく終了しましたが、ここに(単純な)すべてのbashソリューションがあります。
「単純な... bashソリューション」は矛盾した表現ですか?

#!/bin/bash

#loop through all files ending in .jpg
for f in *.jpg;
do

    #cut out everything to the timestamp
    firsthalf=${f%_*_*_*}

    #get from the timestamp on
    lasthalf=${f#*_*_}

    #remove (all) underscores from timestamp
    #note the 2 forward slashes...
    lasthalf=${lasthalf//_/}

    #get our extension
    ext=${lasthalf##*.}

    #now we can remove the extension
    lasthalf=${lasthalf%.*}

    #rename the file
    #change `mv` to `echo` if you want to do a trial run first...
    mv "$f" "${firsthalf}_${lasthalf}_TIMING.${ext}"

done;

PS:ループ内のロジックは、サンプルファイル名のいずれかでテストされました。合格しました。


1
おそらく、bash正規表現を使用する[[ $f ~= (.*)_(.*)_(.*)_(.*)\.jpg ]]; newname=${BASH_REMATCH[1]${BASH_REMATCH:2:4}TIMING.jpgか、何かを使用する方が良いでしょう。(完全にテストされておらず、おそらく間違っていますが、一般的な考え方は、キャプチャグループがBASH_REMATCH配列に入ることです。)
ピーター

@PeterCordes:それは良い点です!bashキャプチャグループを使用したことはありません()。完全に正直に言うと、bashは私がグループを試す最初の言語ではありません。(私はthinkいbash言語だと思います。)それでも、それは良い解決策であり、私に何か称賛を与えました。
J.アラン

うん、純粋なbashで多くのテキスト処理を行う主な理由は、高速なタブ補完関数を書くときです。これは、語句「醜いコード」...に全く新しい意味をもたらします
ピーター・コルド

@PeterCordes:あなたの主張はわかりますが、 、私はコードがあるとは思わない「醜いです」。それはあなたが与えた2行の解決策ではないかもしれませんが、私に関する限り、読むのは難しくありません。それに加えてはよく...コメントしています
J.アラン

私はbash-completionコードが一般的にい(または少なくとも読みにくい)ことについて話していました。それは実際には本当にくはありませんが、ちょっと頭を曲げます(たとえば、変数名を渡し、呼び出し先に名前のある変数printf -v "$3" ...を設定することで、bashでrefによって引数を渡す$3)。コマンドライン全体を分解して戻す一緒にフォロー/デバッグするのはかなり難しいですが、少なくともそれをクリーンアップ/バグを修正しようとしている間にそれを見つけました。githubのコードを
Peter Cordes

1

GUIを使用できる場合は、pyRenamerをお勧めします

ほとんどのディストリビューションにあり、Ubuntuではfiです。

sudo apt-get install pyrenamer

それはあなたが望むすべてを行うことができます。

  • パターンを使用したり、テキストを追加または抑制したりできます。
  • 写真の名前を変更すると、EXIFデータにアクセスできるため、日付/時刻などに基づいてパターンを生成できます。
  • 音楽ファイルの名前を変更する場合、一部のメタデータを使用できます。
  • さらに、プレビューがあり、元に戻すのが難しいいくつかの間違いを防ぐことができます。

ダウンボッターに...理由を説明してくれませんか?OPは、GUIがオプションであるかどうかを指定しませんでした。ほとんどの回答はコンソール/スクリプトの方法に関するものですが、多くのユーザーはGUIソリューションを高く評価しています。または、pyRenamerには気づいていない欠陥があるかもしれません。いずれにせよ、私は下票の理由を知りたいです。
-jrierab

また、Thunar Bulk Renamerを使用して、インタラクティブなGUIをすばやく作成することをお勧めします。
トニーマーティン

@TonyMartinこれは問題のコメントである必要があります、これは答えとは何の関係もありません
Sergiy Kolodyazhnyy

0

ここにあなたの生のビルトイン find + xargs+ sed+ mvoneliner(onelinersが大好き)があります:

find . -name "*.jpg" -print0 | sort -z | xargs -0 sh -c 'for filename; do mv "$filename" $(echo "${filename}" | sed "s/\([0-9]\{8\}\)_\([0-9]\{6\}\)_\([0-9]\{4\}\)/\1\2\3_TIMING/g"); done' sh

説明:

  • find . -name "*.jpg" | sort | xargs sh -c <command> sh :現在のディレクトリにあるすべてのJPEGを一覧表示し、それぞれに対してシェルコマンドを実行します(並べ替えはもちろんオプションですが、どこかにログを記録する場合は少し簡潔にしてください)

  • -print0-z-0:それはバイナリで別のアイテムに良い習慣をある0イン・ザ・ミドルホワイトスペース(ないあなたのケースが)の問題を回避するために、ファイル名をトークン化するとき

  • mv "$filename" $(echo "${filename}" | sed "s/\([0-9]\{8\}\)_\([0-9]\{6\}\)_\([0-9]\{4\}\)/\1\2\3_TIMING/g");:(でバックスラッシュsedの正規表現の可読性を助けるが、それはないんです、単純な)彼らの連続した連結プラスこれで8 + 6 + 4桁のアンダースコア-separeted配列を置換することにより、各ファイルの名前を変更する_TIMINGもの(\iに後方参照をされますi-番目の正規表現グループ)。


参照:Xargs - man sed

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.