我有一个包含数千张图片的文件夹。这些图像成对出现,其中一个的名称为 like apple_0_2_3_suffix1.png
,另一个的名称为apple_0_2_3_suffix2.png
. 我想编写一个 Bash 脚本,随机选择这些对中的 70% 并将它们移动到另一个文件夹中。
我怎样才能做到这一点?
我有一个包含数千张图片的文件夹。这些图像成对出现,其中一个的名称为 like apple_0_2_3_suffix1.png
,另一个的名称为apple_0_2_3_suffix2.png
. 我想编写一个 Bash 脚本,随机选择这些对中的 70% 并将它们移动到另一个文件夹中。
我怎样才能做到这一点?
我怎样才能做到这一点?
有一个想法:
apple*suffix1.png
suffix1.list
suffix1.list
),比如说n
行shuf
文件,只取第一n
行。(可以使用 shuf 命令)mv
命令,或使用 afor loop
将文件移动到目标目录。重要的是,当您打印一个“mv”命令或移动一个文件时,您需要打印/移动带有另一个后缀的相应文件2。笔记
suffix1.list
如果您编写一个脚本,您可以避免存储文件。我只是使用了该文件,因为它可以以某种方式简化流程。也更容易解释我的想法。
让我知道“想法对我没有帮助,我只想要运行代码。 ”
编辑操作想要代码:
1)模拟你的suf1
文件列表:
kent$ seq -f "apple_%03g_suf1.png" 20 > suf1.txt
您应该执行 find/ls 之类的操作来获取文件。我的文件看起来像:
kent$ cat suf1.txt
apple_001_suf1.png
apple_002_suf1.png
apple_003_suf1.png
apple_004_suf1.png
apple_005_suf1.png
...
apple_020_suf1.png
2)shuf,计算70%并生成mv命令:
kent$ shuf suf1.txt|awk '{a[NR]=$0}END{l=NR*0.7;s="mv \"%s\" /path/dest\n"; for(x=1;x<=l;x++){printf s,a[x];sub("suf1","suf2",a[x]);printf s, a[x]}}'
mv "apple_008_suf1.png" /path/dest
mv "apple_008_suf2.png" /path/dest
mv "apple_011_suf1.png" /path/dest
mv "apple_011_suf2.png" /path/dest
mv "apple_009_suf1.png" /path/dest
mv "apple_009_suf2.png" /path/dest
mv "apple_015_suf1.png" /path/dest
mv "apple_015_suf2.png" /path/dest
mv "apple_003_suf1.png" /path/dest
mv "apple_003_suf2.png" /path/dest
mv "apple_013_suf1.png" /path/dest
mv "apple_013_suf2.png" /path/dest
mv "apple_017_suf1.png" /path/dest
mv "apple_017_suf2.png" /path/dest
mv "apple_019_suf1.png" /path/dest
mv "apple_019_suf2.png" /path/dest
mv "apple_006_suf1.png" /path/dest
mv "apple_006_suf2.png" /path/dest
mv "apple_016_suf1.png" /path/dest
mv "apple_016_suf2.png" /path/dest
mv "apple_010_suf1.png" /path/dest
mv "apple_010_suf2.png" /path/dest
mv "apple_004_suf1.png" /path/dest
mv "apple_004_suf2.png" /path/dest
mv "apple_018_suf1.png" /path/dest
mv "apple_018_suf2.png" /path/dest
mv "apple_005_suf1.png" /path/dest
mv "apple_005_suf2.png" /path/dest
可以看到,20 的 70% 是 14,所以生成了 28 个 mv 命令。并且,根据您的要求,随机。
好吧,您不必将它们打印出来,我只想在这里向您展示命令。你可以这样做:
shuf suf1.txt|awk '..my awk codes here..'|sh
做手术mv
。当然,这/path/dest
只是举例。
祝你好运。
#!/bin/bash
n70=$(( $(ls -1 *suffix1.png | wc -l) * 70 / 100 ))
for name in *suffix1.png
do
echo $RANDOM "$name"
done | sort | sed "s=^[0-9][0-9]* ==;s=1\.png==" |\
head -$n70 | xargs -n 1 -I % echo mv %{1,2}.png /path/to/dest/dir