2012-03-15 6 views
12

In zsh, quando devo creare un gruppo di file con zsh, io di solito fare qualcosa di simile:-pad azzerare Come variabili numeriche in zsh (? E forse anche bash)

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

Questo funziona bene , mi dà file con nomi foo-1.txt .. foo-1000.txt.
Tuttavia, questi file non vengono ordinati correttamente, quindi vorrei azzerare la variabile $x, producendo quindi nomi di foo-0001.txt .. foo-1000.txt.

Come farlo in zsh? (E domanda di bonus, come farlo in bash?)

risposta

10

utilizzare il flag -w-seq (in qualsiasi shell):

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

Oh. Scusa, non l'ho visto. – ervingsb

+0

seq -w 001 005 # pad – zzapper

9

È possibile utilizzare di bash 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 

Opere anche in zsh.

2

Lavori in bash (non so per zsh):

echo foo{0000-1000}.txt 
15

Per l'amor di riferimento, se non si ha il controllo della generazione dei valori numerici, si può fare con imbottitura:

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

Visto che $ {(l ... non è molto adatto ai motori di ricerca, guarda sotto Parameter Expansion Flags in zshexpn (1). Inoltre, i delimitatori accoppiati possono essere usati per rendere la sintassi un un po 'più intuitivo: $ {(l {10} {0}) valore} –

+0

Stranamente, zmv non capisce quel modulo, anche se le parentesi funzionano bene: $ {(l (10) (0)) valore}. –

0
  1. printf
    Utilizzo printf per pad con zeri funziona in qualsiasi guscio:

    $ 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. Utilizzare l'espansione delle parentesi (solo bash e zsh mantengono gli zeri iniziali non ksh).

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