Question

Dans zsh, lorsque je dois créer un tas de fichiers avec zsh, je fais généralement quelque chose comme :

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

Cela fonctionne bien, cela me donne des fichiers avec des noms foo-1.txt .. foo-1000.txt.
Cependant, ces fichiers ne sont pas triés correctement, je voudrais donc mettre à zéro le $x variable, produisant ainsi des noms de foo-0001.txt .. foo-1000.txt.

Comment faire ça dans zsh ?(et question bonus, comment faire ça en bash ?)

Était-ce utile?

La solution

Utilisez le -w drapeau à seq (dans n'importe quel shell):

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

Autres conseils

À titre de référence, si vous n'avez pas de contrôle sur la génération des valeurs numériques, vous pouvez effectuer un remplissage avec :

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

Vous pouvez utiliser les bash extension du corset:

$ 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

Fonctionne aussi dans zsh.

Fonctionne en bash (je ne sais pas pour zsh) :

echo foo{0000-1000}.txt 
  1. imprimer
    Utiliser printf pour compléter avec des zéros fonctionne dans n'importe quel 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. Utilisez l'expansion des accolades (seuls bash et zsh conservent les zéros non significatifs, ksh ne le fait pas).

    $ printf '%s\n' foo{1..004}.txt
    foo001.txt
    foo002.txt
    foo003.txt
    foo004.txt
    
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top