Toplu dosyaları yeniden adlandırma


25

Birkaç dosyam var:

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

Bu formatla yeniden adlandırmak istiyorum:

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

_Zaman damgasını kaldırmak ve eklemek gerekiyor _TIMING.



5
Lütfen sorularınızda tutarlı örnekler kullanın. Değiştirmek istediğiniz gibi görünüyor 10.3.100.179ile 10.4.100.135. İstediğin bu mu, yoksa sadece _TIMINGve zamanın hepsini kaldırmak mı istiyorsun _?
terdon

3
İnsanlara tarihler için bir iso8601 standardı olduğunu hatırlatmak için iyi bir zaman (hem dosya adları hem de günlük girdileri için işe yarar) ^^ Dolayısıyla, belki de şu şekilde olmak için yeniden adlandırmayı yeniden düşünmelisiniz: YYYY-AA-GGThh: mm: ss.mmm (ör. : ilk dosyanız şu şekilde olur: 10.4.100.135_01_2016-10-13T13:11:08.389_TIMING.jpg(ve "ZAMANLAMA", özellikle standart daha yaygın hale geldiğinde, şimdi açıkça tarih ve saat (ve milisaniye) gibi göründüğü için bile kaldırılabilir. T, standardın bir parçasıdır ve ben beğenmek için büyüdüm (ve dışarı çıkarmak standartlara uymuyor ^^)
Olivier Dulac

@OlivierDulac :Bir dosya adında kullanmanızı tavsiye etmem . Windows'un bunu desteklemediğine inanıyorum.
Justin,

@Justin iyi nokta. Standart dosya isimleri için bırakılmasını tavsiye eder. Dosya içi sürümü verdim
Olivier Dulac

Yanıtlar:


38

En sevdiğiniz metin editörüyle yükleyin renameutilsve kullanın qmv.

qmveditörünüzdeki tüm isimleri yükler ve kaydettiğinizde ve kapattığınızda değişikliklerinizi gerçek dosyalara uygular. Değişiklikler tutarsızsa (örneğin iki dosya aynı adı alırsa) hiçbir şeye dokunmadan iptal olur. Ayrıca, dairesel adları yeniden doğru şekilde işler.

Genellikle yaparım:

$ qmv -f do

böylece yalnızca bir ad sütunu gösterir (do: yalnızca hedef). İşte göründüğü gibi:

qmw

SublimeText, Atom veya Visual Studio Code'un birçok imleci ile birleştirirseniz, toplu yeniden adlandırma için çok güzel ve güçlü bir araç yapar. Mesela Atom için yaparsın EDITOR="atom -w" qmv -f do.


1
Ubuntu'ya hoş geldiniz! Bu çok havalı!
α Octsнιη

Sadece + olarak imzaladım! o. ;)
J. Allan,

2
Vay, güzel bir araç ve güzel GIF animasyon. Harika ilk cevap, açığız! :)
Byte Commander

1
Görüntüyü çizdiğiniz için teşekkürler @KasiyA ve olumlu yorumlarınız için herkese teşekkürler.
ateijelo

1
@ kasperd Evet, yeniden adlandırma planının hata içerdiği konusunda uyarılır ve daha fazla işlem yapılabilecek etkileşimli bir konsol açar.
ateijelo

27

Kullan 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/' *

İle -nherhangi bir değişiklik yapmadan yapmaya ne olup bittiğini Bu irade çıkışı:

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)

Doğru görünüyorsa, çıkartın. -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

Açıklanması ...

  • s/something/something_else/ ara ve değiştir
  • ^ adın başlangıcı (ankraj)
  • [0-9] herhangi bir numara
  • + Bir önceki karakterin bir veya daha fazlası
  • \.değişmez .( \bu olmadan herhangi bir karakterle eşleşir)
  • () bu kısmı korumak
  • $1$2$3$3 daha önce eşleştirilen ve saklanan şeylere geri göndermeler ()

Not: *Komutun sonunda, geçerli dizindeki tüm görünür dosyalar eşleşir. Gerekirse daha uygun bir küre kullanın.


2
Bazı dağıtımlarda, bu komut şu şekilde kullanılabilir prename(çünkü ilk değişken bir perl ifadesidir)
Peter Cordes

12

mmv aşağıdaki gibi yapabilirsiniz:

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, ... her birini buradaki '*' ile eşleştiriyor.

İle daha da kısa:

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

9

Başka bir renameyaklaşım:

$ 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

Bu istediğiniz gibi çalışıyorsa, kaldırın -n.


5

Aşağıdakileri de kullanabilirsiniz. İlk önce dosyalarınızı yedekleyin ve şunu deneyin:

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/')_Zaman damgasındaki karakterleri siler .

Örneğin:

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
bu en iyi çözümdür. Elbette, Zanna'nın ruhu birkaç dosya için mükemmeldir, ancak topaklanma kabuk tarafından yapıldığından, çözümleri çok sayıda dosyada başarısız olabilir (komut dizesi çok uzun).
rexkogitans

@rexkogitans: Eğer modern bir Linux sistemindeyseniz (yani herhangi bir Ubuntu sürümü), komut satırı uzunluğundaki limit çoklu megabayttır. Ve eğer bir problemse, find -maxdepth 1 -exec rename ... {} +geçerli dizinin listesini yeniden adlandırmak için komut satırına toplu olarak kullanabilirsiniz . ( -name *.jpgne istersen ekleyin veya ekleyin ). Bu sadece bir yeniden adlandırma sistemi çağrısı yerine forks + çalıştırılan sedve mvher dosya adı için çalışan bir kabuk döngüsünden çok daha hızlı yürütülür . ( sedBash'ın yerleşik regex malzemelerini kullanmaktan kurtulabilirsiniz , ancak çatallanma mvhala yavaş.)
Peter Cordes

2

Muhtemelen bitirdiniz, ama işte (basit) tüm bir bashçözüm:
"basit ... bash çözümü" bir oksimoron mu?

#!/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;

Not: Döngüdeki mantık, örnek dosya isimlerinizden biriyle test edildi. Geçti.


1
Muhtemelen bir bash regex [[ $f ~= (.*)_(.*)_(.*)_(.*)\.jpg ]]; newname=${BASH_REMATCH[1]${BASH_REMATCH:2:4}TIMING.jpgveya başka bir şey kullanmak daha iyidir . (Tamamen denenmemiş ve muhtemelen yanlış, ancak genel fikir, yakalama gruplarının BASH_REMATCH dizisine girmesidir.)
Peter Cordes

@PeterCordes: Bu iyi bir nokta! Hiçbir zaman ( bash) grupları yakalamakta hiç kullanmadım ve dürüst olmak gerekirse, bash onları deneyeceğim ilk dil değil. (Bence bashçirkin bir dil.) Yine de, iyi bir çözüm ve bana çok şeref veren bir şey öğretti.
J. Allan,

Evet, saf bash'te bu kadar metin işlemeyi yapmanın asıl nedeni, hızlı olması gereken sekme tamamlama işlevlerini yazarken. "Çirkin kod" cümlesine yepyeni bir anlam getiriyor ...
Peter Cordes

@PeterCordes: rağmen, puanı almak Ben bu kod olduğunu sanmıyorum "çirkin." Verdiğiniz 2 hatlı çözüm olmayabilir, ancak ilgilendiğim kadarıyla okumak zor değil; artı iyi yorumladı ...
J. Allan

Genel olarak bash tamamlama kodu hakkında çirkin (veya en azından okunması zor) olandan bahsediyordum. Aslında çok çirkin değil, sadece biraz akıl bükme (örn. Değişken bir isim geçirerek ve soyunluğun printf -v "$3" ...isminin bulunduğu değişkeni ayarlamak için kullandığı bash ile ref $3. Birlikte takip etmek / hata ayıklamak oldukça zor, en azından hataları temizlemeye / düzeltmeye çalışırken bu şekilde buldum. Github üzerindeki kodu
Peter Cordes

1

Eğer GUI kullanabilirsiniz, pyRenamer'ı tavsiye ederim .

Çoğu dağıtımda mevcut, fi Ubuntu'da:

sudo apt-get install pyrenamer

İstediğin her şeyi ve daha fazlasını yapabilir.

  • Desenleri kullanabilir, metin ekleyebilir veya bastırabilir.
  • Fotoğrafları yeniden adlandırarak EXIF ​​verilerine erişebilir, böylece tarih / saate göre desenler oluşturabilirsiniz ...
  • Müzik dosyalarını yeniden adlandırırken bazı meta verileri kullanabilir.
  • Dahası, geri döndürülmesi zor olan bazı hataların önüne geçebilecek bir önizlemesi var .

Downvoter'a ... Nedenini açıklamak ister misin? OP, GUI'nin bir seçenek olup olmadığını belirtmedi. Yanıtların çoğunun konsol / komut dosyası yöntemine gittiğini görüyorum, ancak çoğu kullanıcı bir GUI çözümünden memnun kalacak. Ya da belki pyRenamer'in bilmediğim bir kusuru var. Her durumda, indirimlerin nedenlerini bilmek isterim.
jrierab

Ayrıca, çabuk etkileşimli bir GUI yaklaşımı için Thunar Bulk Renamer'ı önerebilirim.
Tony Martin

@TonyMartin Bu soru altında yorum yapılmalı, bunun cevabı ile ilgisi yok
Sergiy Kolodyazhnyy

0

İşte ham yerleşik find + xargs+ sed+ mvoneliner (aşk 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

Açıklama:

  • find . -name "*.jpg" | sort | xargs sh -c <command> sh : Geçerli dizindeki tüm JPEG'leri listele sonra her biri için bir kabuk komutu verin (sıralama elbette isteğe bağlıdır, ancak bir yere giriş yapıyorsanız işleri biraz daha temiz tutun)

  • -print0, -z, -0: İkilik ayrı kalemlere iyi alışkanlık olduğu 0ortadaki beyaz boşluk (değil davanız olsa da) ile sorunları önlemek için dosya adları tokenizing zaman

  • mv "$filename" $(echo "${filename}" | sed "s/\([0-9]\{8\}\)_\([0-9]\{6\}\)_\([0-9]\{4\}\)/\1\2\3_TIMING/g");: (De ters eğik sedsitesindeki normal ifade okunabilir bir hal yardımcı olabilir, ancak bu yok olan basit) kendi bitişik birleştirme ayrıca bu 8 + 6 + 4 basamak çizgi-separeted sekansı değiştirerek, her dosya adlandırmak _TIMINGşey ( \ibir geribaşvuru olduğu i- th regex grubu).


Referanslar: Xargs - adam sed

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.