secuenciales secuencial pseudocodigo programacion ejemplos directos descripcion archivos archivo batch-file rename batch-rename

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:

  1. 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)
  2. 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!