在我的父目录中,我有 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