Выберите Случайный файл по расширению, затем выберите «подключенные» файлы - PullRequest
0 голосов
/ 04 августа 2011

ОК, я в тупике.Мне нужен сценарий оболочки, который будет случайным образом выбирать файл с расширением .sct.Используя часть своего имени файла, выберите шесть связанных .mot файлов.Затем переместите их все в другую папку.Мне также нужен пользовательский ввод для количества файлов, которые можно выбрать случайным образом.

Итак, у меня есть такая файловая структура:

123-12345-00.sct
123-12345-00.mot
123-12345-01.mot
123-12345-02.mot
123-12345-03.mot
123-12345-04.mot
123-12345-05.mot

123-12346-00.sct
123-12346-00.mot
123-12346-01.mot
123-12346-02.mot
123-12346-03.mot
123-12346-04.mot
123-12346-05.mot

И так далее.Нужно случайным образом выбрать файл .sct и переместить его и связанные с ним файлы в другой каталог.Надеюсь, я объяснил это достаточно хорошо.

Спасибо за помощь.Я мог бы сделать это в VB, но эта вещь UNIX застряла у меня.Прямо сейчас мы делаем это вручную через тысячи файлов.

Скотт

Ответы [ 3 ]

1 голос
/ 04 августа 2011
#! /usr/bin/env bash

dir="$1"
count="$2"

[ "$dir" ] && [ $count -gt 0 ] && {

    if [ ! -d "$dir" ]; then echo "$0: $dir: no such directory"; exit; fi;

    RANDOM=$(date +%s)                      #init random seed

    for (( c=0; c < $count; c++ )); do

        files=(*.sct)                       #creates array of sct files
        ct=${#files[@]}                     #computes array length

        if [ $ct -eq 0 ]; then break; fi    #no more .sct file, exiting

        sct=${files[$[($RANDOM % $ct)]]}    #pick random file

        # You might want to change this according to your file names
        # Everything before the last dash `-' (included) will be taken
        # as prefix
        prefix=$(echo $sct | sed 's:\(.*-\).*:\1:')

        mot_files=($prefix*.mot)            #creates array of all matching .mot

        mv $sct $dir                        #moves .sct to $dir
        if [ ${#mot_files[@]} -gt 0 ]; then 
            mv ${mot_files[@]} $dir         #moves each matching .mot to $dir
        fi

    done

} || echo "usage: $0 <dir> <num of files>"

Сделал бы это.


/tmp/r > ls
123-12345-00.mot  123-12345-05.mot  123-12346-04.mot
123-12345-00.sct  123-12346-00.mot  123-12346-05.mot
123-12345-01.mot  123-12346-00.sct  123-12348-00.mot
123-12345-02.mot  123-12346-01.mot  123-12348-00.sct
123-12345-03.mot  123-12346-02.mot  foo
123-12345-04.mot  123-12346-03.mot
/tmp/r > mkdir bar
/tmp/r > ./foo bar 2
/tmp/r > ls
123-12346-00.mot  123-12346-02.mot  123-12346-05.mot
123-12346-00.sct  123-12346-03.mot  bar
123-12346-01.mot  123-12346-04.mot  foo
/tmp/r > ls bar
123-12345-00.mot  123-12345-02.mot  123-12345-05.mot
123-12345-00.sct  123-12345-03.mot  123-12348-00.mot
123-12345-01.mot  123-12345-04.mot  123-12348-00.sct
1 голос
/ 04 августа 2011

Этот сценарий перемещает файлы 123-12345-*.sct и 123-12345-*.mot в каталог с именем 123-12345 и т. Д.

Примечание. Это не случайный выбор файла, но все файлы в пределахdirectory. Вы можете изменить это, чтобы принимать аргумент командной строки для числа случайных файлов.Затем вам нужно будет изменить эту команду ls [0-9]*.sct | grep -oe '[0-9]\{3\}\-[0-9]\{5\}', чтобы использовать аргумент командной строки, который представляет собой число файлов и возвращать случайное количество префиксов.

Скопируйте приведенное ниже в файл, скажем, mv_sct_mot.sh в пределахтот же каталог, что и ваши файлы sct и mot.

#!/bin/bash

for prefix in `ls [0-9]*.sct | grep -oe '[0-9]\{3\}\-[0-9]\{5\}'`; do
  mkdir -p ${prefix};
  mv ${prefix}-*.{mot,sct} ${prefix};
done

Чтобы сделать исполняемый файл, измените его разрешение, например:

chmod +x mv_sct_mot.sh

Запустите его следующим образом:

./mv_sct_mot.sh
0 голосов
/ 05 августа 2011

Вот как я бы подошел к этому:

#!/bin/bash
## use the first param as count (1 as default value)
count=${1:-1}
## list all .sct files, random sort and pick the first $count
ls $SRCDIR/*.sct | sort -R | head -n $count | 
    while read file; do
        ## for each file, figure out the prefix and move prefix*
        prefix="${file%-*}-"
        mv -v $prefix* $DESTDIR
    done

РЕДАКТИРОВАТЬ: я изначально пропустил часть, где количество файлов является параметром, обновил скрипт сейчас.Я пропустил ту часть, где вы устанавливаете SRCDIR и DESTDIR только для ясности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...