【问题标题】:To move blocks of folders within a specific range in bash script在 bash 脚本中移动特定范围内的文件夹块
【发布时间】:2019-07-15 19:41:27
【问题描述】:

我必须处理 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,文件夹 A20 包含文件夹 conf11-conf20 等。

提前感谢您的帮助!

【问题讨论】:

  • 此测试if [ "250" -le "500" ] 将始终为真。
  • 是的,在这种情况下是的。但这是一个更大脚本的片段,我在其中提供了几个范围来创建文件夹,这取决于用户定义的采样频率。
  • 我相信这是一个可怕的缩进。做echo -en '\n' 太奇怪了,为什么不只是echoI create 250 conf# folders 只是 seq -f './test_abc/%.0f' 1 250 | xargs mkdirso conf1-conf100 to A100 - 要将 conf2775 移动到 A2800A2775 吗?只需使用步骤100 生成从0( 2775 + 100 ) % 100 * 100 的数字,然后只需将范围内的所有文件移动到目标位置。
  • named A10, A20...A100 so conf1-conf100 to A100 A10 folder to contain folders conf1-con10, - 那么您创建A10A20 文件夹是为了什么?目标文件夹名称是 100 间隔还是 10 间隔或 1000 间隔?
  • 主脚本必须处理 ~ 2775 个文件夹。我发布的是一个试用版,一个关于它应该如何管理文件夹的示例。

标签: bash directory


【解决方案1】:

我只是做了一个简单的脚本,但我认为有更好的想法。

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

【讨论】:

  • 酷!我会立即尝试您的解决方案!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-20
  • 1970-01-01
  • 2021-12-26
  • 1970-01-01
  • 2017-02-01
  • 2021-10-03
  • 1970-01-01
相关资源
最近更新 更多