将文件随机传递给程序

时间:2014-04-15 17:09:42

标签: bash

我有一个程序,它将读取的文件后跟输出文件作为参数,显式:

./my_program file_to_read1 file_to_read2 file_to_read3 [...] file_to_output

我想选择这些文件作为给定文件夹中的N个随机文件。我会知道如何列出它们,使用类似的东西:

ls My_FOLDER/* | sort -R | head -N

但我对管道或脚本语言知之甚少,无法得到我想要的东西,特别是添加最后一个输出文件对我来说似乎很复杂。

有没有系统的方法呢? (到目前为止,我已经使用前一行在读取它们之前将文件移动到临时文件夹中,但是接下来的步骤需要花费更多的时间,因此削减这将是一项重大改进。)

提前谢谢。

3 个答案:

答案 0 :(得分:2)

认为您可能正在寻找shuf

ls My_FOLDER/* | shuf

答案 1 :(得分:2)

对于N = 100,这应该这样做(根据您想要的值替换它):

./my_program `ls My_FOLDER/ | sort -R | head -n 100` file_to_output

如果你运行

,你可以检查将传递给my_program的参数
echo `ls My_FOLDER/ | sort -R | head -n 100` file_to_output

的NaN

答案 2 :(得分:1)

简单的方法是将目录中的所有文件传递给您的程序并在那里进行随机选择。

丑陋的方式是在bash中执行此操作:

一个。将文件列表读入数组

湾使用内置函数$ RANDOM在for循环中生成N个随机数并索引数组

℃。使用构建的字符串加上输出文件

执行程序

除了(1)随机数不均匀分布(2)如果你的文件有空格你真的需要阅读bash手册,那么序列(3)中会有重复,你大部分时间都已完成了。引用,(4)我在脚本中留下了echo命令,让你看看是什么(5)我觉得eval不是最安全的东西。

#!/usr/bin/bash

N=5

i=0
while read line
do
    array[ $i ]="$line"        
    (( i++ ))
done < <(ls)

echo ${array[@]}
echo ${#array[@]}

echo "---"
for i in `seq 0 $((N - 1))`
do
    echo ${array[i]}
    j=$((RANDOM % N))
    echo "j is $j"
    echo "arr[$j] is ${array[$j]}"
    ss="$ss ${array[$j]}"
done

echo "ss is $ss"
# eval ./my_program $args OUTPUTFILE