在bash脚本中的特定范围内移动文件夹块

时间:2019-07-15 19:41:27

标签: bash directory

我必须处理2775个文件夹,每个文件夹都包含一些文件。每个文件夹都命名为conf + n,其中n是一个介于1到2775之间的数字(例如conf1,... conf250,... conf2775)。我创建了一些父文件夹,名为A10,A20 ... A100,A200,... A1000,A2000等。问题如下:我想将前100个文件夹移动,因此将conf1-conf100移至A100,conf101- con200到A200等。

问题是文件夹的总数(2775)不固定,因为我希望我的脚本适应不同范围的文件夹。

在我的试用脚本中,我创建了250个conf#文件夹以及25个A#文件夹,但是在将conf1-conf10移至A10,将conf11-conf20移至A20等过程中,我陷入了困境。为此循环,但失败了。

 #!/bin/bash
     for d in ./test_abc/
       do (cd "$d" &&
        for ((i=1;i<=250;i++))
         do
          mkdir $i
         done);
       done
while true; do
   if  [ "250" -le "500" ];
    then
     pfldrs=$((250 / 10))
     echo -en '\n'
     echo -e "\x1B[31m CREATING BLOCKS ...\x1B[0m \x1B[32m $op \x1B[0m"
     echo -en '\n'
      for d in ./test_abc/
       do (cd "$d" &&
        for ((k=1;k<=$pfldrs;k++))
         do
          m=$(($k*10))
           mkdir A$m
         done);
       done
      break
   fi
done

我希望A10文件夹包含conf1-con10文件夹,folderA20包含conf11-conf20文件夹,等等。

预先感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我只是编写了一个简单的脚本,但是我认为有更好的主意。

move.sh

#!/bin/bash

source_dir=$1
target_dir=$2
interval=$3

total_dir=$(basename $(find $source_dir -type d -name "conf*" | sort -Vr | head -1) | sed "s/conf//g")
echo "total $total_dir interval $interval"

target=0
for i in $(seq 1 $total_dir); do
  if [ $i -gt $target ]; then
    target=$(($target + $interval))
    mkdir $target_dir/A$target
  fi

  mv $source_dir/conf$i $target_dir/A$target/ 
done

运行

./move.sh ${source_dir where conf* dirs are exist} ${target_dir where A* dirs will be created} ${interval}

ex) ./move.sh ./conf_dir ./move_dir 10