Bir önek veya sonek ekleyerek yerel klasördeki dosyaları yeniden adlandırma


12

Bir klasörde birçok dosya var ve onlara önek veya sonek ( her ikisi de değil ) eklemek istiyorum . Kontrol ettim burada ve ben kullanabilirsiniz öğrendim

for filename in *.jpg; do mv "$filename" "prefix_$filename"; done;

ile biten tüm dosyalara bir önek eklemek için .jpg(ve kaldırırsam .jpg, geçerli klasördeki tüm dosyalara önek ekler).

Ancak şunu yapabilmek istiyorum

  • (Olduğunu, yeniden adlandırma bir sufix ekleme filename.extiçin filename.whatever.ext)
  • Ön ekin veya son ekin zaten mevcut olup olmadığını kontrol edin ve atlayın,
  • addprefix whatever *.extVeya gibi bağımsız değişkenleri kabul eden bir takma ad oluşturunaddsufix whatever *.*

Yanıtlar:


10

Eğer kullanıyorsanız bash, o zaman bu tek satırlık sizin için yapabilir (değişkenleri var varsayarak $prefix, $suffixve $extensionhazır)

mv "$filename" "$prefix${filename%.$extension}$suffix.$extension"

Senaryonuz böyle olabilir

#!/bin/bash
# Usage: addprefix <prefix> <files>

prefix=$1
shift
for f in "$@"
do
  mv "$f" "$prefix$f"
done

ve

#!/bin/bash
# addsuffix <suffix> <files>

suffix=$1
shift
for f in "$@"
do
  extension=${f##*.}
  if [ -z $extension ]; then
    mv "$f" "$f$suffix"
  else
    mv "$f" "${f%.$extension}$suffix.$extension"
  fi
done

Neredeyse mükemmel! (1) ön ekin veya son ekin zaten mevcut olup olmadığını (ve sonra atlandığını) ve (2) uzantısız dosyalarda çalışıp çalışmadığını kontrol etmek mükemmel olurdu. Çok rahatsız ettiğim için özür dilerim ...
Brezilyalı Adam

(1) için mv'yi sararak önek kontrolünü ekleyebilirim (bence, test edilmedi) if [ $f == $prefix* ]ve eki if [ $f == *$suffix$([ ! -z $extension ] && echo -n '.')$extension ]addsuffix'teki çift mv komutlarının etrafında değiştirebilirsiniz . (2) için, ben korkunç bir programcı değilim, zaten uzantısı olmayan dosyalar üzerinde çalışması gerekir.
Aaron Okano

7

Hile yapması gereken bir Perl renamekomutu var. Yine de dikkat edin: denilen birkaç farklı komut vardır rename, bu yüzden perlexprargümanı olarak bir bekleyen Perl betiğine sahip olduğunuzdan emin olun . Bu, Debian ve türevleri (Ubuntu, Mint,…) üzerindeki paket renametarafından sağlanan perl, ancak farklı bir yardımcı programa sahip olabilecek diğer dağıtımlarda olmayan komuttur rename.

martin@martin ~/test % touch a.txt
martin@martin ~/test % touch b.txt
martin@martin ~/test % rename 's/^(prefix)?/prefix/' *.txt
martin@martin ~/test % ll
insgesamt 0
-rw-rw-r-- 1 martin martin 0 Sep 19 23:56 prefixa.txt
-rw-rw-r-- 1 martin martin 0 Sep 19 23:56 prefixb.txt
martin@martin ~/test % rename 's/^(prefix)?/prefix/' *.txt
martin@martin ~/test % ll
insgesamt 0
-rw-rw-r-- 1 martin martin 0 Sep 19 23:56 prefixa.txt
-rw-rw-r-- 1 martin martin 0 Sep 19 23:56 prefixb.txt

Gördüğünüz gibi, bu idempotent - birden çok kez çağırdığınızda öneki tekrar eklemez.

Dizelerin (sıfır uzunluklu) başlangıcını ( ^) veya başlangıcını isteğe bağlı bir prefixdize ile değiştirerek çalışır prefix.

Bunu sizin için bir kabuk betiği veya kabuk işlevinde kapsülleme olarak bırakacağım

Postfix biraz daha zor, çünkü dosya adının hangi kısmının uzantıyı oluşturduğunu anlamanız gerekiyor ...


Bu güzel bir cevap, ama daha evrensel bir şey arıyordum; bu cevap için hem perl hem de bu spesifik (veya eşdeğeri) renamemevcut olmanız gerekir . Ve soneklerin biraz daha zor olduğunu biliyorum, bağlantılı soruda ele alınmadı ve linux, bash, kabuk komut dosyası, perl ve düzenli ifadelere yeni başlayan biriyim, bu yüzden "biraz daha zor" benim için oldukça zor ! :)
Brezilyalı Adam

4

İle zsh:

autoload zmv # in ~/.zshrc
zmv '(*~*suffix).ext' '${1}suffix.ext'

~araçlarının globbing operatörü hariç olarak zsh.


1

Geçerli klasördeki tüm görüntülerin önekini ve uzantısını değiştirmek için basit bir örnek.

prefix=EG_
extension=.jpg
for i in $(ls); do mv $i "$prefix${i%.JPG}$extension";  done

Eğer bunu değiştirmek değiştirmeden önce verilerinizi etkileyecektir nasıl kontrol etmek isterseniz mv tarafından yankı

IMG_7993.JPG çıktısı EG_IMG_7993.jpg

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.