将按顺序排列的编号文件移动到新目录

将按顺序排列的编号文件移动到新目录

在我的父目录中,我有 78,160 个文件。
文件名为:sb_604_dpm_0089000.dpx、sb_604_0089001.dpx 等。

我想将文件移动到 4 个子目录 subdir1、subdir2、subdir3、subdir4。每个目录中必须按顺序正好有 20,000 个文件。

是否可以将一定范围的文件从父目录移动到子目录,即从 sb_604_dpm_0089000.dpx 移动到 sb_604_dpm_0108,999.dpx 文件移动到 subdir1,从 sb_604_dpm_0109000.dpx 移动到 sb_604_dpm_0128,999.dpx 文件移动到 subdir2 等等。

最终文件夹将仅包含前 60,000 个文件之后的剩余文件。

所有这些都应该使用批处理文件完成,理想情况下能够在移动进行之前指定/检查范围。这可能吗?

在 DOS 中,我可能能够自己编写一个批处理文件来解决这个问题,但对于 Linux,我有点不知所措... 我不是程序员,我只是一个 Linux 用户,正在寻找比 GUI 更快/更好的方法来实现这一点,所以任何帮助都值得感激。请尽可能保持简单!

提前致谢!

答案1

如果这是一次性任务,则可以使用 shell 扩展,如下所示:

mkdir subdir1 subdir2 subdir3 subdir4
mv sb_604_dpm_{0089000..0108999}.dpx subdir1
mv sb_604_dpm_{0109000..0128999}.dpx subdir2
mv sb_604_dpm_{0129000..0148999}.dpx subdir3
mv sb_604_dpm_*.dpx                  subdir4

{1..5}扩展为1 2 3 4 5,因此上述命令扩展为第一/第二/第三个 20,000 个文件,最后一行处理其余部分。

答案2

类似这个小脚本的东西应该可以为你做到这一点:

#!/bin/bash

files=(*.dpx)
folder=1
count=0

if [ ! -d "folder$folder" ]; then
   mkdir "folder$folder"
fi

for i in "${files[@]}"
do
   mv "$i" "folder$folder"
   let count=$count+1
   if [ "$count" == "20000" ]; then
      let count=0
      let folder=$folder+1
      if [ ! -d "folder$folder" ]; then
        mkdir "folder$folder"
      fi
   fi
done

将脚本放入要移动的文件所在的文件夹内的文件中(例如,主文件夹中名为“my-files”的文件夹),并将文件命名为“move”。然后从命令行:

$ cd ~/my-files
$ chmod 755 move
$ ./move

相关内容