Önek / sonek ile nasıl yeniden adlandırılır?


98

mv original.filename new.original.filenameOrijinal dosya adını yeniden yazmadan nasıl yapabilirim ?

Bir şeyi yapabileceğimi hayal ederdim mv -p=new. original.filenamebelki mv original.filename new.~ya da her neyse - ama man mv/ info mvsayfalarına baktıktan sonra böyle bir şey göremiyorum .

Tabii bunu yapmak için bir kabuk komut dosyası yazabilirim, ancak bunun için mevcut bir komut / bayrak yok mu?

Yanıtlar:


125

Bash ve zsh'da bunu Brace Expansion ile yapabilirsiniz . Bu, küme ayraçları içindeki öğelerin listesini genişletir. Örneğin:

# echo {vanilla,chocolate,strawberry}-ice-cream
vanilla-ice-cream chocolate-ice-cream strawberry-ice-cream

Böylece yeniden adlandırmanızı aşağıdaki gibi yapabilirsiniz:

mv {,new.}original.filename

bu genişledikçe:

mv original.filename new.original.filename

Teşekkürler, bu en iyi çözüm gibi görünüyor - aynı zamanda ksh ile de çalışıyor.
Peter Boughton

29
Bunun yapmadığı şey, joker kartlarla çalışmaktır. Yani, a, b, c dosya adlarını içeren bir dizinde "echo {, new.} *" Kullanılması "abc new. *" Listesini verir (çünkü küme ayracı genişletmesi yoluyla dosya adı oluşturma, joker karakterleri genişletmeden önce gerçekleşir - en azından çıkarım yoluyla).
Jonathan Leffler

Aylardır sadece temel kabuk işlevlerini kullanarak böyle bir çözüm arıyorum ... Bu kadar basit bir şey asla bulamazdım, çok teşekkürler!
flonk

Brace Expansion referansınız için teşekkürler :-) tam olarak aradığım şey!
Pim Hazebroek

1
Örneği seviyorum. Şimdi öğle yemeğimde Baskin Robbins'e gitme havasında hissediyorum.
Sridhar Sarnobat

158

Şu rename(1)komutu kullanabilirsiniz :

rename 's/(.*)$/new.$1/' original.filename

Düzenleme: Eğer renamemevcut değildir ve birden fazla dosya, kabuk komut dosyası gerçekten bu kısa ve basit olabilir adlandırmak gerekir. Örneğin , geçerli dizinde tümünü olarak yeniden adlandırmak *.jpgiçin prefix_*.jpg:

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

Bu hafta sonu grafit yüklediler ve esasen ("tüm * .example dosyalarını conf klasörüne kopyalayıp örnek soneki kaldırarak") bir adım attılar. Onlar açısından gerçekten tembel, ama rename 's/(.*).example/$1/' *.examplebeni sıkıntıdan kurtardı.
Conrad.Dean

2
Şimdiye kadarki en iyi cevap bu.
lifeisfoo

1
$Bu senaryoda birinciye ihtiyacınız olduğunu sanmıyorum . Öyleyse sadece's/(.*)/new.$1/'
akıllıca

1
renamekomutu RHEL 6 makinemde çalışmıyor. Bu komutun farklı versiyonları var mı? for ... doneBenim için çalıştı.
robsch


10

İnsanların bir renamekomuttan bahsettiğini gördüm , ancak bu, Unix sistemlerinde rutin olarak mevcut değil (örneğin Linux sistemlerinde veya Cygwin - her ikisinde de yeniden adlandırma komut dosyası yerine çalıştırılabilirdir). Bu sürümünün renameoldukça sınırlı bir işlevselliği vardır:

rename from to file ...

O değiştirir gelen dosya isimlerinin parçası To ve kılavuz sayfasında verilen örnekte olduğu:

rename foo foo0 foo? foo??

Bu, foo1'i foo01'e ve foo10'u foo010'a vb. Yeniden adlandırır.

renameİlk baskı Camel kitabından çıkardığım ve daha sonra dosyaları yeniden adlandırmak için genişlettiğim bir Perl betiği kullanıyorum .

#!/bin/perl -w
#
# @(#)$Id: rename.pl,v 1.7 2008/02/16 07:53:08 jleffler Exp $
#
# Rename files using a Perl substitute or transliterate command

use strict;
use Getopt::Std;

my(%opts);
my($usage) = "Usage: $0 [-fnxV] perlexpr [filenames]\n";
my($force) = 0;
my($noexc) = 0;
my($trace) = 0;

die $usage unless getopts('fnxV', \%opts);

if ($opts{V})
{
    printf "%s\n", q'RENAME Version $Revision: 1.7 $ ($Date: 2008/02/16 07:53:08 $)';
    exit 0;
}
$force = 1 if ($opts{f});
$noexc = 1 if ($opts{n});
$trace = 1 if ($opts{x});

my($op) = shift;
die $usage unless defined $op;

if (!@ARGV) {
    @ARGV = <STDIN>;
    chop(@ARGV);
}

for (@ARGV)
{
    if (-e $_ || -l $_)
    {
        my($was) = $_;
        eval $op;
        die $@ if $@;
        next if ($was eq $_);
        if ($force == 0 && -f $_)
        {
            print STDERR "rename failed: $was - $_ exists\n";
        }
        else
        {
            print "+ $was --> $_\n" if $trace;
            print STDERR "rename failed: $was - $!\n"
                unless ($noexc || rename($was, $_));
        }
    }
    else
    {
        print STDERR "$_ - $!\n";
    }
}

Bu, dosya adlarını eşlemek için herhangi bir Perl ikamesi veya transliterate komutu yazmanıza olanak tanır. İstenen belirli örnekte şunları kullanacaksınız:

rename 's/^/new./' original.filename

Teşekkürler, eğer ikinci bir cevabı kabul edebilseydim bu olurdu. Kullanabileceğim herhangi bir şey üzerinde çalışacak bir şey olarak standart bir komut istedim, ancak bu komut dosyasını sık kullandığım makinelere koyabilirim ve yine de yardımcı olacaktır.
Peter Boughton

James Wong Arch Linux için, sadece karşıdan olabilir ve üzerinden bu komut dosyası yüklemek belirtiyor pacmankullanarak: pacman -Sy perl-rename. Sonra bashrc'nize bir takma ad ekleyin:alias rename='perl-rename'
Jonathan Leffler

peki ya "from" veya "to" boş
dizelerse

1
@Troyseph - '.htmldosya adlarına eklemek için, - komutunu kullanarak dosya adlarının her yerinden 's/$/.html/'kaldırın tmp, kullanın 's/tmp//g'( tmpher yerde hiçbir şey olmadan bulun ve değiştirin).
Jonathan Leffler

4

Dizindeki dosyaları toplu olarak yeniden adlandırmanın en kolay yolu şudur:

ls | xargs -I fileName mv fileName fileName.suffix

2

Bir değişikliğe açıksa, önek yerine bir sonek kullanabilirsiniz. Sonra, orijinal dosya adını almak ve soneki eklemek için sekme tamamlamayı kullanabilirsiniz.

Aksi takdirde, bu mv komutu tarafından desteklenen bir şey değildir. Basit bir kabuk betiği bununla başa çıkabilir.


Çoğunlukla ikisini de isterim, ancak öncelikle önek - dediğiniz gibi, sekme tamamlama sonekleri işleyebilir.
Peter Boughton

2

Burada harika cevaplar olduğunu biliyorum, ancak son ek eklerken dosya adı uzantılarını işlemek için bir referans bulamadım.

wavDosya uzantısından önce bir klasördeki tüm dosyalara '_en' son ekini eklemem gerekiyordu .

Sihir burada: %.*

for filename in *.wav; do mv $filename ${filename%.*}_en.wav; done;

Farklı dosya uzantılarını kullanmanız gerekiyorsa, bu yanıtı kontrol edin . Biraz daha az sezgisel.


1

Benim durumumda, onlarla çalışmadan önce yeniden adlandırılması gereken bir grup dosyam var. Her dosyanın grup içinde kendi rolü ve kendi kalıbı vardır.

Sonuç olarak, aşağıdaki gibi yeniden adlandırma komutlarının bir listem var:

f=`ls *canctn[0-9]*`   ;  mv $f  CNLC.$f
f=`ls *acustb[0-9]*`   ;  mv $f  CATB.$f
f=`ls *accusgtb[0-9]*` ;  mv $f  CATB.$f
f=`ls *acus[0-9]*`     ;  mv $f  CAUS.$f

Şunu da dene:

f=MyFileName; mv $f {pref1,pref2}$f{suf1,suf2}

Bu, ön ekler ve son ekler içeren tüm kombinasyonları üretecektir:

pref1.MyFileName.suf1
...
pref2.MyFileName.suf2

Aynı sorunu çözmenin başka bir yolu, eşleme dizisi oluşturmak ve aşağıda gösterildiği gibi her dosya türü için ortak önek eklemektir:

#!/bin/bash
unset masks
typeset -A masks
masks[ip[0-9]]=ip
masks[iaf_usg[0-9]]=ip_usg
masks[ipusg[0-9]]=ip_usg
...
for fileMask in ${!masks[*]}; 
do  
registryEntry="${masks[$fileMask]}";
fileName=*${fileMask}*
[ -e ${fileName} ] &&  mv ${fileName} ${registryEntry}.${fileName}  
done

1

Dosyaları toplu yeniden adlandırma bash betiği

#!/bin/bash
# USAGE: cd FILESDIRECTORY; RENAMERFILEPATH/MultipleFileRenamer.sh FILENAMEPREFIX INITNUMBER
# USAGE EXAMPLE: cd PHOTOS; /home/Desktop/MultipleFileRenamer.sh 2016_
# VERSION: 2016.03.05.
# COPYRIGHT: Harkály Gergő | mangoRDI (https://wwww.mangordi.com/) 

# check isset INITNUMBER argument, if not, set 1 | INITNUMBER is the first number after renaming
if [ -z "$2" ]
    then i=1;
else
    i=$2;
fi

# counts the files to set leading zeros before number | max 1000 files
count=$(ls -l * | wc -l)
if [ $count -lt 10 ]
    then zeros=1;
else
    if [ $count -lt 100 ]
        then zeros=2;
    else
        zeros=3
    fi
fi

# rename script
for file in *
do
    mv $file $1_$(printf %0"$zeros"d.%s ${i%.*} ${file##*.})
    let i="$i+1"
done
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.