我的所有图片都放在一个文件夹中,大小超过 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
等的目录中。folder2
folder3
将脚本另存为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