Bash - 选择随机文件对

时间:2013-04-28 16:25:14

标签: bash

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

我该怎么做?

2 个答案:

答案 0 :(得分:2)

  

我该怎么做?

有一个想法:

  1. 列出所有apple*suffix1.png
  2. 将上面的输出保存到文件中,例如suffix1.list
  3. 现在您可以知道70%是suffix1.list行中有多少个文件(或行,n
  4. shuf该文件,只需先行n行。 (可以使用shuf命令)
  5. 在这里你可以使用awk,sed为你生成mv命令,或使用for loop将文件移动到dest目录。重要的是,当您打印一个“mv”命令或移动一个文件时,您需要使用另一个后缀2打印/移动相应的文件。
  6. 注意

    如果您编写一个脚本,则可以避免存储文件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就是例如。

    祝你好运。

答案 1 :(得分: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中移除“echo”,为实际运行提供满意的
  • 警告:文件名不应包含空格......