我有一个包含数千张图片的文件夹。这些图片成对出现,其中一个名称为apple_0_2_3_suffix1.png
,另一个名称为apple_0_2_3_suffix2.png
。我想编写一个Bash脚本,随机选择70%的这些对并将它们移动到另一个文件夹中。
我该怎么做?
答案 0 :(得分:2)
我该怎么做?
有一个想法:
apple*suffix1.png
suffix1.list
suffix1.list
行中有多少个文件(或行,n
行shuf
该文件,只需先行n
行。 (可以使用shuf命令)mv
命令,或使用for loop
将文件移动到dest目录。重要的是,当您打印一个“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
就是例如。
答案 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