如何以递归方式将 20 个文件的批次从 1000 个文件的文件夹移动到编号的文件夹中

如何以递归方式将 20 个文件的批次从 1000 个文件的文件夹移动到编号的文件夹中

我有一个包含 1000 个(或更多)文件的文件夹。我想要一个脚本来创建一个编号文件夹,然后将前 20 个文件(按名称排序)移动到该文件夹​​中。然后应该对其他文件执行此操作,将文件夹编号增加 1,直到所有文件都在文件夹中。

我已尝试以下命令,但它不会自动执行整个目录,也不会自动增加文件夹编号:

N=1000;
for i in ${srcdir}/*; do
  [ $((N--)) = 0 ] && break
  cp -t "${dstdir}" -- "$i"
done

如何使用 bash 来完成此操作?

答案1

该脚本采用两个(可选)参数:要分区的目录和分区大小。由于您没有说您是否只想移动文件,或者移动所有内容,我假设您指的是文件,所以我使用了 find 命令。

一些评论,

  • 如果您没有指定 shell,那么在 perl、ruby 或 python 中更容易完成类似的操作。
  • find with maxdepth 1 只查找目录
  • 您可以将文件移动到任何位置,只需更改文件夹命名即可
  • 由于使用了find,因此可以添加-name、-mtime、-ctime等。

复制一些.sh,

#!/bin/bash
path=${1:-"."} #directory to start
howmany=${2:-20} #partition size
pushd $path; #move there
part=1; #starting partition
LIST="/usr/bin/find -maxdepth 1 -type f" #move only files?
#LIST="ls" #move everything #be careful, $folder will get moved also :-)
count=`$LIST |/usr/bin/wc -l`; #count of files to move
while [ $count -gt 0 ]; do
    folder="folder-$part";
    if [ ! -d $folder ]; then /usr/bin/mkdir -p $folder; fi
    /usr/bin/mv `$LIST |/usr/bin/sort |/usr/bin/head -$howmany` $folder/.
    count=`$LIST |/usr/bin/wc -l`; #are there more files?
    part=$(expr $part + 1)
done
popd $path

这是一个用于测试的脚本(我没有多余的 1000 个文件),

for f in 0 1 2 3 4 5 6 7 8 9; do
  for g in 0 1 2 3 4 5 6 7 8 9; do
    for h in 0 1 2 3 4 5 6 7 8 9; do
        touch $f$g$h
    done
  done
done

答案2

for你的 filesName 以相应的数字结尾但 shell 是zsh.

for N in {0..800..20}: do
    mkdir "dir$N"
    mv "files{$N..$((N+19))}" "/path/to/dir$N/"
done

如果它在 中bash,那么:

for N in {0..800..20}: do
    mkdir "dir$N"
    eval mv "files{$N..$((N+19))}" "/path/to/dir$N/"
done

学习帖:如何在序列的 shell 大括号扩展中使用 $variable?

相关内容