将目录中的所有图像以 30 张为一批复制到子目录中

将目录中的所有图像以 30 张为一批复制到子目录中

我的所有图片都放在一个文件夹中,大小超过 1.6K。我想从该文件夹中批量制作 30 张图片,然后将该批图片复制到其各自的单独文件夹中。这些文件夹的名称可以是任意名称,例如folder1、、folder2等等fodler3

我不知道该如何解决这个问题。我考虑编写一个 Python 脚本来逐个复制文件,一旦计数达到 30,就更改文件夹。但我想也许你们对如何使用 Bash 来做到这一点有更好的想法。

答案1

使用GNU parallel

#!/bin/bash
mkdir_mv(){ target=$1; shift; mkdir "$target"; mv -t "$target" "$@"; }
export -f mkdir_mv
parallel -n 30 -j1 mkdir_mv "folder{#}" {} ::: *

由于普通程序mv不会创建目录,因此我们首先定义一个函数来执行此操作。我们需要导出该函数以使其与parallel

parallel将从包含图片的文件夹运行命令。

解释

  • -n 30每次并行运行使用 30 个参数
  • -j 1仅并行运行 1 个进程(= do不是并行运行)
  • {#}当前运行次数
  • {}每次运行 30 个参数。
  • :::参数分隔符。
  • *输入文件。

parallel可以安装:

sudo apt install parallel

答案2

您可以使用这个 Bash 脚本:

#!/bin/bash
from="/path/to/parent"       # <--- replace this
to="/path/to/target"         # <--- replace this
i=1

until [ "$(ls -A "$from")" = "" ]; do
    mkdir "$to/folder$i"
    files=("$from"/*)
    for f in "${files[@]:0:30}"; do
        mv "$f" "$to/folder$i"
    done
    i=$((i + 1))
done

在上面的脚本中,将变量的路径替换from为包含图像的目录的绝对路径,将变量的路径to替换为要移动图像的目录的绝对路径。30 张图像的批次将移动到名为、、folder1等的目录中。folder2folder3

将脚本另存为batch_move.sh(或您希望的任何名称)并通过运行使其可执行:

chmod u+x /path/to/batch_move.sh

然后您可以按如下方式运行脚本:

/path/to/batch_move.sh

注意:为了安全起见,请先将部分图片复制到另一个目录中,然后先在该目录中测试脚本。如果脚本按预期运行,则对所有图片运行该脚本。

答案3

您可以使用 for 循环,并以 30 为增量。

#!/bin/bash

source=/opt/files/old
target=/opt/files/new

cd "$source" # && touch {000..300}

eval a=($( \
    ls --quoting-style=shell-escape) \
)
for ((b=0; b<${#a[@]}; b+=30)); do
    mkdir -p "$target/folder$((++c))" && mv -t "$_" "${a[@]:$b:30}"
done

相关内容