Этот демонстрационный скрипт показывает, как вы можете выбрать случайный файл из каталога, и должен быть хорошим началом.
#!/bin/bash
# Set up test data.
rm -rf tmpdata ; mkdir tmpdata
touch tmpdata/fileA tmpdata/fileB tmpdata/fileC tmpdata/fileD tmpdata/fileE
# From and To directories
fromdir=./tmpdata
todir=./tmpdata2
# Get a list of the files to a temporary file.
ls -1 ${fromdir} >/tmp/filelist.$$
# Select a number from 1 to n where n is the line count of that file.
# Then use head and tail to get the line.
filenum=$(expr $RANDOM % $(cat /tmp/filelist.$$ | wc -l) + 1)
file=$(head -${filenum} /tmp/filelist.$$ | tail -1)
# DEBUG stuff.
cat /tmp/filelist.$$ | sed 's/^/DEBUG file: /'
echo "DEBUG nmbr: ${filenum}"
echo "'cp ${fromdir}/${file} ${todir}'"
# Remove temporary file.
rm -f /tmp/filelist.$$
И некоторые примеры вывода:
pax$ ./cprnd.sh
DEBUG file: fileA
DEBUG file: fileB
DEBUG file: fileC
DEBUG file: fileD
DEBUG file: fileE
DEBUG nmbr: 3
'cp ./tmpdata/fileC ./tmpdata2'
pax$ ./cprnd.sh
DEBUG file: fileA
DEBUG file: fileB
DEBUG file: fileC
DEBUG file: fileD
DEBUG file: fileE
DEBUG nmbr: 1
'cp ./tmpdata/fileA ./tmpdata2'
pax$ ./cprnd.sh
DEBUG file: fileA
DEBUG file: fileB
DEBUG file: fileC
DEBUG file: fileD
DEBUG file: fileE
DEBUG nmbr: 5
'cp ./tmpdata/fileE ./tmpdata2'
"Магия" заключается в этих двух строках:
filenum=$(expr $RANDOM % $(cat /tmp/filelist.$$ | wc -l) + 1)
file=$(head -${filenum} /tmp/filelist.$$ | tail -1)
Первый использует wc
, чтобы получить количество строк (количество файлов). Затем он дает вам остаток при делении случайного числа на это значение, так что вы получите 0..n-1
и, добавив 1, вы получите 1..n
. Предположим, это дает 10 для файла из пятидесяти строк.
Следующая строка использует head
, чтобы получить первые десять строк, а затем передает это через tail
, чтобы получить последнюю строку этого набора (то есть, десятую строку из файла).