我刚开始使用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
答案 0 :(得分:2)
是否需要使用数组?否则,对于bash 4,您可以执行
for i in {01..08} {11..27} {29..32} {34..50}; do
echo "dir_a/dir_b/sub${i}/dir_c/"
done
对于较早版本的bash,您必须自己添加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检查。我知道这不是你要求的,但它无限简单。如果您被允许,我也强烈建议您重命名该目录树。