batch file - pseudocodigo - Lote cambie el nombre de los archivos secuenciales por relleno con ceros
descripcion de archivo secuencial (7)
Pitón
import os
path = ''/path/to/files/''
for filename in os.listdir(path):
prefix, num = filename[:-4].split(''_'')
num = num.zfill(4)
new_filename = prefix + "_" + num + ".png"
os.rename(os.path.join(path, filename), os.path.join(path, new_filename))
podría compilar una lista de nombres de archivo válidos suponiendo que todos los archivos que comienzan con "output_" y terminan con ".png" son archivos válidos:
l = [(x, "output" + x[7:-4].zfill(4) + ".png") for x in os.listdir(path) if x.startswith("output_") and x.endswith(".png")]
for oldname, newname in l:
os.rename(os.path.join(path,oldname), os.path.join(path,newname))
Intento
(desde: http://www.walkingrandomly.com/?p=2850 )
En otras palabras, reemplazo file1.png con file001.png y file20.png con file020.png y así sucesivamente. He aquí cómo hacerlo en bash
#!/bin/bash
num=`expr match "$1" ''[^0-9]*/([0-9]/+/).*''`
paddednum=`printf "%03d" $num`
echo ${1/$num/$paddednum}
Guarde lo anterior en un archivo llamado zeropad.sh
y luego haga el siguiente comando para hacerlo ejecutable
chmod +x ./zeropad.sh
A continuación, puede utilizar el script zeropad.sh
siguiente manera
./zeropad.sh frame1.png
que devolverá el resultado
frame001.png
Lo único que queda es usar esta secuencia de comandos para cambiar el nombre de todos los archivos .png en el directorio actual de modo que sean cero.
for i in *.png;do mv $i `./zeropad.sh $i`; done
Perl
(desde: relleno de la almohadilla cero, por ejemplo, Imagen (2) .jpg -> Imagen (002) .jpg )
use strict;
use warnings;
use File::Find;
sub pad_left {
my $num = shift;
if ($num < 10) {
$num = "00$num";
}
elsif ($num < 100) {
$num = "0$num";
}
return $num;
}
sub new_name {
if (//.jpg$/) {
my $name = $File::Find::name;
my $new_name;
($new_name = $name) =~ s/^(.+//[/w ]+/()(/d+)/)/$1 . &pad_left($2) .'')''/e;
rename($name, $new_name);
print "$name --> $new_name/n";
}
}
chomp(my $localdir = `pwd`);# invoke the script in the parent-directory of the
# image-containing sub-directories
find(/&new_name, $localdir);
Rebautizar
También de la respuesta anterior:
rename ''s//d+/sprintf("%04d",$&)/e'' *.png
Tengo un montón de archivos nombrados así:
output_1.png
output_2.png
...
output_10.png
...
output_120.png
¿Cuál es la forma más fácil de cambiar el nombre de aquellos para que coincida con una convención, por ejemplo, con un máximo de cuatro decimales, para que los archivos se denominan:
output_0001.png
output_0002.png
...
output_0010.png
output_0120.png
Esto debería ser fácil en Unix / Linux / BSD, aunque también tengo acceso a Windows. Cualquier idioma está bien, pero me interesan algunas frases geniales (si las hay).
Bastante fácil, aunque combina algunas características que no son inmediatamente obvias:
@echo off
setlocal enableextensions enabledelayedexpansion
rem iterate over all PNG files:
for %%f in (*.png) do (
rem store file name without extension
set FileName=%%~nf
rem strip the "output_"
set FileName=!FileName:output_=!
rem Add leading zeroes:
set FileName=000!FileName!
rem Trim to only four digits, from the end
set FileName=!FileName:~-4!
rem Add "output_" and extension again
set FileName=output_!FileName!%%~xf
rem Rename the file
rename "%%f" "!FileName!"
)
Editar: leyó mal que no está buscando un archivo por lotes, sino cualquier solución en cualquier idioma. Lo siento por eso. Para compensarlo, un One-liner de PowerShell:
gci *.png|%{rni $_ (''output_{0:0000}.png'' -f +($_.basename-split''_'')[1])}
Pegue un ?{$_.basename-match''_/d+''}
allí si tiene otros archivos que no siguen ese patrón.
De hecho, solo necesitaba hacer esto en OSX. Aquí están los scripts que creé para él: ¡una sola línea!
> for i in output_*.png;do mv $i `printf output_%04d.png $(echo $i | sed ''s/[^0-9]*//g'')`; done
Estoy siguiendo la solución de Adam para OSX.
Algunos gotchyas que encontré en mi escenario fueron:
- Tenía un conjunto de archivos .mp3, por lo que sed captó el '' 3 '' en el sufijo '' .mp3 ''. (Utilicé basename en lugar de echo para rectificar esto)
- Mis .mp3 tenían espacios dentro de sus nombres, por ejemplo, " pista de audio 1.mp3 ", esto estaba causando que basename + sed se estropeara un poco, así que tuve que citar el parámetro "$ i".
Al final, mi línea de conversión se veía así:
for i in *.mp3 ; do mv "$i" `printf "track_%02d.mp3/n" $(basename "$i" .mp3 | sed ''s/[^0-9]*//g'')` ; done
Para el cambio de nombre en masa, la única solución segura es mmv
comprueba las colisiones y permite el cambio de nombre en cadenas y ciclos, algo que está más allá de la mayoría de los scripts. Lamentablemente, cero relleno no está demasiado caliente a. Un sabor:
c:> mmv output_[0-9].png output_000#1.png
Aquí hay una solución:
c:> type file
mmv
[^0-9][0-9] #1/00#2
[^0-9][0-9][^0-9] #1/00#2#3
[^0-9][0-9][0-9] #1/0#2#3
[^0-9][0-9][0-9][^0-9] #1/0#2#3
c:> mmv <file
Here hay un script de Python que escribí que rellena los ceros según el número más grande presente e ignora los archivos no numerados en el directorio dado. Uso:
python ensure_zero_padding_in_numbering_of_files.py /path/to/directory
Cuerpo de guión:
import argparse
import os
import re
import sys
def main(cmdline):
parser = argparse.ArgumentParser(
description=''Ensure zero padding in numbering of files.'')
parser.add_argument(''path'', type=str,
help=''path to the directory containing the files'')
args = parser.parse_args()
path = args.path
numbered = re.compile(r''(.*?)(/d+)/.(.*)'')
numbered_fnames = [fname for fname in os.listdir(path)
if numbered.search(fname)]
max_digits = max(len(numbered.search(fname).group(2))
for fname in numbered_fnames)
for fname in numbered_fnames:
_, prefix, num, ext, _ = numbered.split(fname, maxsplit=1)
num = num.zfill(max_digits)
new_fname = "{}{}.{}".format(prefix, num, ext)
if fname != new_fname:
os.rename(os.path.join(path, fname), os.path.join(path, new_fname))
print "Renamed {} to {}".format(fname, new_fname)
else:
print "{} seems fine".format(fname)
if __name__ == "__main__":
sys.exit(main(sys.argv[1:]))
$rename output_ output_0 output_? # adding 1 zero to names ended in 1 digit
$rename output_ output_0 output_?? # adding 1 zero to names ended in 2 digits
$rename output_ output_0 output_??? # adding 1 zero to names ended in 3 digits
¡Eso es!