LINUX.ORG.RU

bash и генерирование файлов.


0

0

задача такая, есть каталог, в нем с десяток файлов с разными расширениями,

надо из 10 сделать 1000 файлов.

делать надо так: брать файл, и создавать его копию, с таким же расширением, но другим именем, таким какого еще нет.

Так вот.

Есть ли в bash функции генерирующие случайную последовательность символов, причем символов могущих входить в имя файла? есть ли в bash способ выделить расширение файла из имени файла?

anonymous

Ответ на: комментарий от Shaman007

>head /dev/urandom | md5sum | head -c 10 спасибо

>egrep -o [1-9a-zA-Z]\. бывает что точек несколько в имени файла, например некотрые файлы начинаются с точек.

anonymous
()
Ответ на: комментарий от Shaman007

в общем вся проблема свелась к выделения расширения >egrep -o [1-9a-zA-Z]\. конечно не работает, решил попробовать с sed, но в этих регулярных выражениях сам черт ногу сломит. всего то и надо чтобы взять и заментить текст вида [:alnum:] несколько раз потом точка на пустое место пробую после прочтения info sed sed s/[:alnum:]*\.//g нифига.

подскажите как это сделать? выделить расширение файла средствами bash?

anonymous
()
Ответ на: комментарий от anonymous

${fname##*.} --- остаток строки после последней точки. ${fname#*.} --- остаток строки после первой точки.

Описание смотри в мане, глава "Parameter Expansion".

anonymous
()
Ответ на: комментарий от anonymous

cпасибо, помогло
вот что в итоге получилось

#!/bin/sh

if [ $# -ne 1 ]; then
echo "Usaage: $0 directory" >&2
exit 1
fi
cd $1
n=`ls | wc -l`
while [ $n -le 1000 ]; do
for i in `ls`; do
ext=`echo ${i##*.}`
base=`head /dev/urandom | md5sum | head -c 10`
cp -f $i $base.$ext
done
n=`ls | wc -l`
done

проблема в том что он не реагирует на увличение n.
ctrl+c правда работает.
не подскажите в чем проблема?

anonymous
()
Ответ на: комментарий от anonymous

А файлы создаются? Попечатай n внутри while.

Если честно, то использование циклов и подстановок для решения подобных задач, некрасиво и неэффективно. Более правильный метод --- использовать 
связку find | filter | xargs:

find -mindepth 1 -maxdepth 1 -name '*.*' | \
    gawk -F. '{for (i=0;i<100;i++) {printf("%s %d%d.%s\n", $0, rand()*10e6, i, $NF)}}' | \
    xargs -l1 cp

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.