كيفية استخدام المتغيرات الرقمية ذات اللوحة الصفرية في zsh (وربما أيضًا bash؟)

StackOverflow https://stackoverflow.com//questions/9716020

سؤال

في zsh، عندما يتعين علي إنشاء مجموعة من الملفات باستخدام zsh، عادةً ما أفعل شيئًا مثل:

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

هذا يعمل بشكل جيد، ويعطيني ملفات بأسماء foo-1.txt .. foo-1000.txt.
ومع ذلك، فإن هذه الملفات لا يتم فرزها بشكل جيد، لذا أرغب في وضع علامة صفر على ملف $x متغير، وبالتالي إنتاج أسماء foo-0001.txt .. foo-1000.txt.

كيف نفعل ذلك في ZSH؟(وسؤال إضافي، كيف نفعل ذلك في باش؟)

هل كانت مفيدة؟

المحلول

استخدم ال -w العلم ل seq (في أي قذيفة):

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

نصائح أخرى

للإشارة إلى ذلك، إذا لم يكن لديك القدرة على التحكم في توليد القيم الرقمية، فيمكنك إجراء الحشو باستخدام:

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

يمكنك استخدام باش توسيع هدفين:

$ 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

يعمل في zsh أيضًا.

يعمل في باش (لا أعرف لـ zsh):

echo foo{0000-1000}.txt 
  1. printf
    استخدام printf للوسادة التي تحتوي على أصفار يعمل في أي غلاف:

    $ 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. استخدم توسيع الأقواس (فقط bash و zsh يحتفظان بالأصفار البادئة ksh).

    $ printf '%s\n' foo{1..004}.txt
    foo001.txt
    foo002.txt
    foo003.txt
    foo004.txt
    
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top