0

我有一个包含数千张图片的文件夹。这些图像成对出现,其中一个的名称为 like apple_0_2_3_suffix1.png,另一个的名称为apple_0_2_3_suffix2.png. 我想编写一个 Bash 脚本,随机选择这些对中的 70% 并将它们移动到另一个文件夹中。

我怎样才能做到这一点?

4

2 回答 2

2

我怎样才能做到这一点?

有一个想法:

  1. 列出所有apple*suffix1.png
  2. 将上面的输出保存到文件中,比如说suffix1.list
  3. 现在您可以知道 70% 是多少个文件(或其中的行suffix1.list),比如说n
  4. shuf 文件,只取第一n行。(可以使用 shuf 命令)
  5. 在这里您可以使用 awk,sed 为您生成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只是举例。

祝你好运。

于 2013-04-28T16:37:20.937 回答
1
#!/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
  • 将其保存到您的图像所在的目录中
  • 将 /path/to/dest/dir 替换为真实的(必须存在)
  • 运行并检查结果(什么都不做,只显示会移动的东西 - 试运行)
  • 从 xargs 中删除“回声”对于真正的运行是满意的
  • 警告:文件名不应包含空格...
于 2013-04-28T18:16:30.390 回答