shell编程:定义包含零填充值的数组

时间:2013-11-26 12:10:37

标签: arrays shell

我刚开始使用shell编程。我想自动更改目录,然后重命名那里的一些文件。这是我的问题:目录的名称已编号,但目录< 10是零填充(01 02 ... 09)。如何在不手动键入每个目录名的情况下使用某种排序来定义数组? 这是我到目前为止所尝试的:

array = (printf "%.2d "  {1..8}  {11..27}  {29..32} {34..50})    ## should say 01 02 03 ..08 11..27 29..32 34..50

for i in "${array[@]}"
do
  echo "dir_a/dir_b/sub$i/dir_c/"
done

然而,它不起作用,结果如下:“subprintf”,“sub%.2s”,“sub1”等。 你能帮助我吗?

在下一步中,我想过滤数组中的某些数字,例如03,09,10,28,33因为这些目录不存在。是否有一些简单的解决方案来创建这样的数组而不连接5个独立的数组?

非常感谢, 的Kati

4 个答案:

答案 0 :(得分:2)

是否需要使用数组?否则,对于 4,您可以执行

for i in {01..08} {11..27} {29..32} {34..50}; do
    echo "dir_a/dir_b/sub${i}/dir_c/"
done

对于较早版本的,您必须自己添加0:

for i in 0{1..8} {11..27} {29..32} {34..50}; do
    echo "dir_a/dir_b/sub${i}/dir_c/"
done

当然,如果你想拥有一个数组,你可以做到

array=({01..08} {11..27} {29..32} {34..50})

array=(0{1..8} {11..27} {29..32} {34..50})

答案 1 :(得分:0)

你可以这样做:

declare -a dirs=('01' '02' '03' '04' '05' '06' '07' '08')
echo ${dirs[@]}
01 02 03 04 05 06 07 08

# Make up next sequence
declare -a b=`seq 11 18`
echo ${b[@]}
11 12 13 14 15 16 17 18

# Add sequences together
dirs=("${dirs[@]}" ${b})
echo ${dirs[@]}
01 02 03 04 05 06 07 08 11 12 13 14 15 16 17 18

答案 2 :(得分:0)

#/bin/bash

raw=({01..08} {11..27} {29..32} {34..50})
filter=(03 09 10 28 33)

is_in() {
    for e in "${@:2}"; do [[ "$e" == "$1" ]] && return 0; done
    return 1
 }

for i in ${raw[@]}; do
    is_in $i ${filter[@]} || echo "dir_a/dir_b/sub$i/dir_c"
done

它将获取原始数组中的数字,并排除过滤器数组中每个数字的出现。

答案 3 :(得分:0)

find [0-9][0-9] -type d | while read dirname
do
    if [ $(echo "${dirname}" | sed -n '/01/p') ]
    then
    cd "${dirname}"
    mv foo bar
    cd ..
    fi
done

然后,您可以为包含要重命名的文件的每个目录编写另一个elif和sed检查。我知道这不是你要求的,但它无限简单。如果您被允许,我也强烈建议您重命名该目录树。