كيفية استخدام المتغيرات الرقمية ذات اللوحة الصفرية في zsh (وربما أيضًا bash؟)
سؤال
في 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
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
استخدم توسيع الأقواس (فقط bash و zsh يحتفظان بالأصفار البادئة ksh).
$ printf '%s\n' foo{1..004}.txt foo001.txt foo002.txt foo003.txt foo004.txt
لا تنتمي إلى StackOverflow