2012-03-15 6 views
12

En zsh, cuando tengo que crear un montón de archivos con zsh, por lo general hacer algo como:-pad cero Cómo variables numéricas en zsh (? Y tal vez también Bash)

for x in $(seq 1 1000); do .....; done 

Esto funciona bien , me da archivos con los nombres foo-1.txt .. foo-1000.txt.
Sin embargo, estos archivos no se ordenan bien, por lo que me gustaría rellenar con cero la variable $x, lo que produce nombres de foo-0001.txt .. foo-1000.txt.

¿Cómo hacer eso en zsh? (Y pregunta extra, cómo hacerlo en bash?)

Respuesta

10

usar la bandera -w a seq (en cualquier shell):

$ seq -w 1 10 
01 
02 
03 
04 
05 
06 
07 
08 
09 
10 
+0

Oh. Lo siento, no vi eso. – ervingsb

+0

seq -w 001 005 # pads – zzapper

9

Usted puede usar de golpe brace expansion:

$ for n in file-{0001..1000}.txt; do echo $n; done 
file-0001.txt 
file-0002.txt 
file-0003.txt 
file-0004.txt 
file-0005.txt 
file-0006.txt 
file-0007.txt 
file-0008.txt 
file-0009.txt 
file-0010.txt 
... 
file-0998.txt 
file-0999.txt 
file-1000.txt 

Obras en zsh también.

2

Obras en bash (no saben con zsh):

echo foo{0000-1000}.txt 
15

Por el amor de referencia, si usted no tiene control sobre la generación de los valores numéricos, puede hacerlo rellenando con:

% value=314 
% echo ${(l:10::0:)value} 
0000000314 
% echo $value 
314 
+3

Al ver que $ {(l ... no es muy amigable para los motores de búsqueda, búsquelo en Parameter Expansion Flags en zshexpn (1). También se pueden usar delimitadores emparejados para hacer que la sintaxis sea Un poco más intuitivo: $ {(l {10} {0}) value}. –

+0

Extrañamente, zmv no entiende esa forma, aunque los paréntesis funcionan bien: $ {(l (10) (0)) value}. –

0
  1. printf
    Uso de printf para rellenar con ceros funciona en cualquier shell:

    $ printf 'foo%03d.txt\n' $(seq 4) 
    foo001.txt 
    foo002.txt 
    foo003.txt 
    foo004.txt 
    
    $   printf 'foo%03d.txt\n' {1..4}  # works in bash, ksh, zsh. 
    $ n=4;  printf 'foo%03d.txt\n' {1..$n}  # only ksh, zsh 
    $ n=4; eval printf '"foo%03d.txt\n" {1..'"$n"'}' # workaround needed for bash 
    
  2. Utilice la expansión de llaves (solo bash y zsh mantienen los ceros a la izquierda ksh).

    $ printf '%s\n' foo{1..004}.txt 
    foo001.txt 
    foo002.txt 
    foo003.txt 
    foo004.txt 
    
Cuestiones relacionadas