2008-10-16 7 views
63

Как мне сделать mv original.filename new.original.filename без повторного ввода оригинального имени файла?Как переименовать с помощью префикса/суффикса?

я бы себе представить, что в состоянии сделать что-то вроде mv -p=new. original.filename или, возможно, mv original.filename new.~ или что-то - но я не могу видеть ничего подобного, посмотрев на man mv/info mv страниц.

Конечно, я могу написать сценарий оболочки, чтобы сделать это, но нет ли в нем существующей команды/флага?

ответ

90

В Bash и ЗШ вы можете сделать это с помощью Brace Expansion. Это просто расширяет список элементов в фигурных скобках. Например:

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

Таким образом, вы можете сделать свое переименование следующим образом:

mv {,new.}original.filename 

как это расширяется:

mv original.filename new.original.filename 
+0

Спасибо, это выглядит как лучшее решение - также работает с ksh. –

+22

Что это не значит, это работа с дикими картами. То есть в каталоге, содержащем имена файлов a, b, c, используя «echo {, new.} *», Выдается список «abc new. *» (Поскольку генерация имени файла через расширение скобки происходит перед расширением символов wild card - по крайней мере по умозаключению). –

+0

С тех пор я ищу такое решение только с использованием базовых функций оболочки ... Я бы никогда не придумал что-то простое, спасибо большое! – flonk

2

Если он открыт для изменения, вы можете использовать суффикс вместо префикса. Затем вы можете использовать табуляцию, чтобы получить исходное имя файла и добавить суффикс.

В противном случае это не то, что поддерживается командой mv. Однако простой скрипт оболочки может справиться.

+0

Часто я хочу обоих, но в первую очередь приставка - как вы говорите, автодополнению может обрабатывать суффиксы. –

103

Вы можете использовать переименование (1) Команда:

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

Edit: Если переименование нет в наличии, и вы должны переименовать несколько файлы, сценарии оболочки действительно может быть короткими и простыми для это. Например, чтобы переименовать все .jpg к prefix_ .jpg в текущем каталоге:

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

Установленный графит в эти выходные, и у них есть шаг, который по существу («скопируйте все * .example файлы в папку conf, удалив суффикс примера»). Реальные ленивы с их стороны, но «переименовать»/(.*). Example/$ 1/'* .example' спас меня от скуки. –

+2

Это лучший ответ. – lifeisfoo

+0

Я не думаю, что вам нужен первый '' 'в этом сценарии. Так что просто '' s /(.*)/ new. $ 1/'' – wisbucky

7

Я видел, как люди упоминают команду rename, но обычно недоступен в системах Unix (в отличие от Linux-систем, например, Cygwin), на обоих из которых переименование - это исполняемый файл, а не сценарий). Эта версия rename имеет довольно ограниченную функциональность:

rename from to file ... 

Он заменяет от часть имен файлов с в и пример, приведенный на странице человека является:

rename foo foo0 foo? foo?? 

Это переименовывает foo1 в foo01 и foo10 в foo010 и т. Д.

Я использую скрипт Perl под названием rename, который я изначально выкопал fr о первом издании книги Camel, около 1992 года, а затем расширенном, чтобы переименовать файлы.

#!/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 ([email protected]) { 
    @ARGV = <STDIN>; 
    chop(@ARGV); 
} 

for (@ARGV) 
{ 
    if (-e $_ || -l $_) 
    { 
     my($was) = $_; 
     eval $op; 
     die [email protected] if [email protected]; 
     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"; 
    } 
} 

Это позволяет вам написать любую команду Perl или транслитерацию для сопоставления имен файлов. В конкретном примере, запрошенном, вы будете использовать:

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

Спасибо, если бы я согласился на второй ответ, это было бы так. Я хотел, чтобы стандартная команда была чем-то, что будет работать только над тем, что я могу использовать, но я могу поместить этот скрипт на машины, которые я часто использую, и это все равно будет полезно. –

+0

[James Wong] (http://stackoverflow.com/users/6486307/james-wong) отмечает, что для Arch Linux вы можете просто загрузить и установить этот скрипт через 'pacman', используя: ' pacman -Sy perl- rename'. Затем добавьте псевдоним к нему в вашем bashrc: 'alias rename = 'perl-rename'' –

20

Вы можете достичь Unix совместимого многократного переименования файлов (с использованием шаблонов), создав цикл:

for file in *; do 
    mv $file new.${file%%} 
done 
+4

В чем разница между этим и [что Саймон Леманн уже ответил] (http://stackoverflow.com/questions/208181/ как к переименованию-с приставкой-суффикс # 208220)? –

+2

Это прекрасно работает. Что делает '' '$ {file %%}' '' делать? Похоже на просто $ {file} – Sidmitra

1

В моем случае у меня есть группу файлов, которую нужно переименовать, прежде чем я смогу с ними работать. Каждый файл имеет свою собственную роль в группе и имеет свой собственный шаблон.

В результате у меня есть список команд переименования, как это:

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 

Попробуйте также:

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

Это будет производить все комбинации с приставками и суффиксами:

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

Другим способом решения этой проблемы является создание массива отображения и добавление c orespondent префикс для каждого типа файла, как показано ниже:

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

Массовое переименование файлов Баш скрипт

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

 Смежные вопросы

  • Нет связанных вопросов^_^