Как переименовать с префиксом/суффиксом?
как я делаю mv original.filename new.original.filename
без перепечатки исходного имени файла?
Я бы предположил, что могу сделать что-то вроде mv -p=new. original.filename
или, возможно,mv original.filename new.~
или что-то еще - но я не вижу ничего подобного, посмотрев на man mv
/info mv
страницы.
конечно, я мог бы написать скрипт для этого, но нет команды/флаг для нее?
7 ответов:
в Bash и zsh вы можете сделать это с Фигурные Скобки. Это просто расширяет список элементов в фигурных скобках. Например:
# 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
вы можете использовать команду переименовать(1):
rename 's/(.*)$/new./' original.filename
Edit: если переименование недоступно, и вам нужно переименовать более одного файла, сценарии оболочки могут быть действительно короткими и простыми для этого. Например, переименовать все .JPG в предварительно сменив префикс таблиц.jpg в текущем каталоге:
for filename in *.jpg; do mv "$filename" "prefix_$filename"; done;
вы можете добиться совместимого с unix многократного переименования файлов (используя подстановочные знаки), создав цикл for:
for file in *; do mv $file new.${file%%} done
Я видел, как люди упоминают
rename
команда, но она обычно не доступна в системах Unix (в отличие от систем Linux, скажем, или Cygwin - на обоих из которых rename является исполняемым, а не скриптом). Это версияrename
имеет довольно ограниченную функциональность:rename from to file ...
заменяет С часть имен файлов с до, и пример, приведенный в разделе человек:
rename foo foo0 foo? foo??
это переименовывает foo1 в foo01, и foo10 к foo010, etc.
Я использую скрипт Perl под названием
rename
, который я первоначально выкопал из первого издания Camel book, около 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: [-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"; } }
это позволяет вам написать любую замену Perl или транслитерировать команду для сопоставления имен файлов. В конкретном запрошенном примере вы бы использовали:
rename 's/^/new./' original.filename
Если он открыт для модификации, вы можете использовать суффикс вместо префикса. Затем вы можете использовать tab-completion, чтобы получить исходное имя файла и добавить суффикс.
в противном случае, нет это не то, что поддерживается командой mv. Однако простой сценарий оболочки может справиться.
в моем случае у меня есть группа файлов, которые должны быть переименованы, прежде чем я смогу работать с ними. Каждый файл имеет свою собственную роль в группе и имеет свой собственный узор.
в результате у меня есть список команд переименования такой:
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
другой способ решить ту же проблему-создать отображение массив и добавить корреспондент префикс для каждого типа файла, как показано ниже:
#!/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
массовое переименование файлов bash script
#!/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 "" ] then i=1; else i=; 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 _$(printf %0"$zeros"d.%s ${i%.*} ${file##*.}) let i="$i+1" done