varios renombrar para nombre masivo eliminar directorio copiar comando cambiar archivos archivo bash rename filenames prefix mv

bash - renombrar - ¿Cómo cambiar el nombre con prefijo/sufijo?



renombrar directorio linux (7)

Archivos de cambio de nombre masivo script bash

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

¿Cómo hago mv original.filename new.original.filename sin volver a escribir el nombre del archivo original?

Me imagino poder hacer algo como mv -p=new. original.filename mv -p=new. original.filename o quizás mv original.filename new.~ o lo que sea - pero no puedo ver nada como esto después de mirar man mv / info mv pages.

Por supuesto, podría escribir un script de shell para hacer esto, pero ¿no hay un comando / indicador existente para él?


En Bash y zsh puedes hacer esto con Brace Expansion . Esto simplemente expande una lista de elementos entre llaves. Por ejemplo:

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

Entonces puedes cambiar tu nombre de la siguiente manera:

mv {,new.}original.filename

como esto se expande a:

mv original.filename new.original.filename


En mi caso, tengo un grupo de archivos que debe cambiar de nombre antes de poder trabajar con ellos. Cada archivo tiene su propio rol en el grupo y tiene su propio patrón.

Como resultado, tengo una lista de comandos de cambio de nombre como este:

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

Prueba esto también:

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

Esto producirá todas las combinaciones con prefijos y sufijos:

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

Otra forma de resolver el mismo problema es crear mapeo de mapeo y agregar prefijo corespondiente para cada tipo de archivo como se muestra a continuación:

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


He visto a personas mencionar un comando de rename , pero no está disponible de forma rutinaria en los sistemas Unix (a diferencia de los sistemas Linux, por ejemplo, o Cygwin, en ambos casos, el cambio de nombre es un ejecutable en lugar de un script). Esa versión de rename de rename tiene una funcionalidad bastante limitada:

rename from to file ...

Reemplaza la parte de los nombres de los archivos con a , y el ejemplo que se da en la página man es:

rename foo foo0 foo? foo??

Esto cambia el nombre de foo1 a foo01, y foo10 a foo010, etc.

Utilizo un script Perl llamado rename , que originalmente extraje de la primera edición del libro Camel, alrededor de 1992, y luego lo extendí, para cambiar el nombre de los archivos.

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

Esto le permite escribir cualquier comando de sustitución o transliteración de Perl para asignar nombres de archivo. En el ejemplo específico solicitado, usarías:

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


Podría usar el comando rename (1):

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

Editar: si el cambio de nombre no está disponible y debe cambiar el nombre de más de un archivo, las secuencias de comandos del shell pueden ser cortas y simples para esto. Por ejemplo, para cambiar el nombre de todos .jpg a prefix_ .jpg en el directorio actual:

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


Puede lograr un cambio de nombre de archivo múltiple compatible con Unix (usando comodines) creando un bucle for:

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


Si está abierto a una modificación, puede usar un sufijo en lugar de un prefijo. Luego, puede usar el tab-completion para obtener el nombre de archivo original y agregar el sufijo.

De lo contrario, esto no es algo que sea compatible con el comando mv. Sin embargo, una simple secuencia de comandos de shell podría hacer frente.