Добро пожаловать! Войти Зарегистрироваться

Расширенный

Тестирование ЛР 20 и ЛР 21

Написал w-495 
Тестирование ЛР 20 и ЛР 21
15 February 2014 09:09
Утилита для генерации большого числа файлов с заданными свойствами:

https://github.com/w495/mai-workshops-2013/blob/master/ws21/find-files/gentest.sh

#!/usr/bin/env bash

##
##  Скрипт генерирует случайные директории со случайными поддиректориями
##  и копирует создает в них файлы со случайными именами:
##      * копии всех файлов из текущей папки;
##      * жесткие ссылки файлов из текущей папки;
##      * символические ссылки файлов из текущей папки;
##      * пустые файлы.
##  При повторном запуске скрипта,
##  результаты предыдущего запуска будут удалены.
##
##  ВНИМАНИЕ:   при удалении результатов предыдущего запуска,
##              удаляться все директории из текущей папки.
##              Смиритесь, или найдите, как это исправить.
##              Подсказка: исправить это очень просто.
##
##  Если скрипт запущен как `./gentest.sh delete`, то просто будут удалены
##  результаты предыдущего запуска без создания новых директории.
##

##
## Удалим все директории в текущей папке.
## Для этого пройдемся по всему ее содержимому.
##
for i in * ; do
    ##
    ## Если встретили директорию, то удалим ее.
    ##
    if [ -d "$i" ]; then
        echo "# rm -rf $i";
        ##
        ## Удаляем рекурсивно, молча и беспощадно. Читайте `man rm`.
        ##
        rm -rf "$i";
    fi;
done;

##
## Проверим, чему равен аргумент командной строки.
## Символ `x` добавляется, чтобы избежать сравнение с пустой строкой.
##
if [ "x$1" == "xdelete" ]; then
    echo "only delete!";
    ##
    ## Выходим из скрипта с кодом `0`.
    ##
    exit 0;
fi


##
## Получим список файлов в текущей папке.
## Для этого воспользуемся конвейером командной оболочки
##
FILES=$(ls -l | grep ^- | awk '{print $9}');

##
## Случайно создадим 5 директорий
##
for i in {1..5}; do
    ##
    ## `${RANDOM}` дает случайное число
    ##
    DIRNAME1="${i}-${RANDOM}";

    echo -e "# ${i}\t-> ${DIRNAME1}";

    mkdir "${DIRNAME1}";

    ##
    ## А в пяти случайных директориях создадим 5 случайных поддиректорий.
    ##
    for i in {1..5}; do

        DIRNAME2="${i}-${i}-${RANDOM}";

        echo -e "# ${i}x${i}\t-> ${DIRNAME2}";

        mkdir "${DIRNAME1}/${DIRNAME2}";

        ##
        ## Для каждой поддиректории проведем действия над файлами
        ## из текущей папки.
        ##
        for FNAME in $FILES; do

            ##
            ## С помощью конвейера создадим строку из восьми случайных символов.
            ## Попробуйте в консоли вот такую команду:
            ##
            ##  cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 8 | head -n 1;
            ##
            ## Кстати, очень удобно для генерации каптч и паролей.
            ## На самом деле, тут мы создадим не одну строку, а шесть.
            ##
            RS=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 8 | head -n 6);

            ##
            ## Сейчас мы собираемся пройтись по списку
            ## из шести случайных строк.
            ## И для каждой выполнить разные действия.
            ## А чтобы их отличать, мы заведем счетчик
            ##
            COUNTER=0;

            for MY_RANDOM_STRING in $RS; do

                NEW_FNAME=${DIRNAME1}/${DIRNAME2}/${MY_RANDOM_STRING};

                if   [ $COUNTER -eq 1 ]; then

                    ##
                    ## Создадим копию файла
                    ##
                    cp "${FNAME}" "${NEW_FNAME}.copy";

                elif [ $COUNTER -eq 2 ]; then

                    ##
                    ## Создадим символическую ссылку.
                    ## Она будет битой.
                    ##
                    ln -s "${FNAME}" "${NEW_FNAME}";

                elif [ $COUNTER -eq 3 ]; then

                    ##
                    ## Создадим символическую ссылку.
                    ## Она будет относительной.
                    ##
                    ln -s "../../${FNAME}" "${NEW_FNAME}";

                elif [ $COUNTER -eq 4 ]; then

                    ##
                    ## Создадим символическую ссылку.
                    ## Она будет абсолютной.
                    ##
                    ln -s "${PWD}/${FNAME}" "${NEW_FNAME}";

                elif [ $COUNTER -eq 5 ]; then

                    ##
                    ## Создадим жесткую ссылку
                    ##
                    ln "${FNAME}" "${NEW_FNAME}";

                else

                    ##
                    ## Создадим пустой файл
                    ##
                    touch "${NEW_FNAME}";

                fi;

                ##
                ## Увеличиваем счетчик на единичку.
                ##
                let COUNTER=COUNTER+1;

            done;
        done;
    done;
done;



Исправлений: 1. Последний раз редактировал w-495 в 15.02.2014, 09:09.
Re: Тестирование ЛР 20 и ЛР 21
16 February 2014 22:10
Утилита для создания файлов в прошлом:

https://github.com/w495/mai-workshops-2013/blob/master/ws21/del-mtime/past-files.sh

#!/usr/bin/env bash

##
##  Создает файлы со случайными именами и заранее зашитыми расширениями.
##  После создания и файлов меняется время модификации.
##  Время выставляется на N дней в прошлое от текущего момента.
##  Файлы создаются в текущей директории.
##  Как использовать:
##      $ ls -la
##      4 -rwxr-xr-x 1 w495 w495 2345 фев 16 20:22 past-files.sh
##      $ ./past-files.sh 100000
##      $ ls -la
##         4 -rwxr-xr-x 1 w495 w495    2345 фев 16 20:22 past-files.sh
##      1084 -rw-rw-r-- 1 w495 w495 1109828 май  3  1740 test-Cuth.avi
##      1084 -rw-rw-r-- 1 w495 w495 1109869 май  3  1740 test-dsfp.swf
##      1084 -rw-rw-r-- 1 w495 w495 1109766 май  3  1740 test-ESVN.mkv
##      1084 -rw-rw-r-- 1 w495 w495 1109746 май  3  1740 test-GIpE.mov
##      1084 -rw-rw-r-- 1 w495 w495 1109816 май  3  1740 test-ksiR.mp4
##      1084 -rw-rw-r-- 1 w495 w495 1109844 май  3  1740 test-lRil.3gp
##      1084 -rw-rw-r-- 1 w495 w495 1109738 май  3  1740 test-PXPa.vob
##      1084 -rw-rw-r-- 1 w495 w495 1109873 май  3  1740 test-sYPo.wmv
##      1084 -rw-rw-r-- 1 w495 w495 1109682 май  3  1740 test-xDyz.flv
##

##
## Список суффиксов для новых файлов.
##
SUFFIXES="3gp avi flv mkv mov mp4 swf vob wmv";

##
## Количество дней.
##
N=$1;

##
## Регулярное выражение, для проверки,
## является ли веденное количество дней числом.
## [ru.wikibooks.org]Регулярные_выражения
##
NUMBER_REGEXP='^[0-9]+$';

##
## Проверка что были введены дни,
## и они являются числом.
## Если нет, то устанавливаем значение по умолчанию.
##
if ! [[ $N =~ ${NUMBER_REGEXP} ]] ; then
    N="4";
fi;

DAYS_AGO=$(date "+%Y-%m-%d" -d "${N} day ago" ) ;

for SUFFIX in $SUFFIXES ; do
    ##
    ## Генерируем один случайный мегабайт
    ##
    RANDON_BYTES=$( cat /dev/urandom | dd bs=256kB count=17 2> /dev/null);
    ##
    ## На основании этого же мегабайта, мы соорудим случайное имя файла.
    ##
    RANDON_NAME=$(echo ${RANDON_BYTES} | tr -dc 'A-Za-z' | fold -w 4 | head -n 1 )

    if [ -z "${RANDON_NAME}" ]; then
        ##
        ## Если выделить случайную строку нам не удалось,
        ## то давайте подставлять наносекунды.
        ## `date +%N` как раз их и вернет.
        ##
        RANDON_NAME=$(date +%N);
    fi;
    FILENAME="test-${RANDON_NAME}.${SUFFIX}"

    ##
    ## Записываем случайные байты в файл со случайным именем.
    ##
    echo "${RANDON_BYTES}" > "${FILENAME}"

    ##
    ## Выставляем файлу дату в прошлом.
    ##
    touch -d "${DAYS_AGO}" "${FILENAME}"
done;



Исправлений: 1. Последний раз редактировал w-495 в 16.02.2014, 22:10.
Re: Тестирование ЛР 20 и ЛР 21
24 February 2014 15:03
Утилита для создания файлов в прошлом:
Вариант на Python.

[gist.github.com]



# !/usr/bin/python
# --*-- coding: utf-8 --*--

import os
import time
from datetime import date, timedelta

FILE_NAME = '1.txt'

DAYS_AGO = {
    'atime' : 2,
    'mtime' : 4
}

##
## Получим информацию о файле
##
stinfo = os.stat(FILE_NAME)

print()
print("\033[36m stinfo = %s \033[0m \n"%{stinfo})

##
## Покажем atime и mtime
##
print ("\033[1m atime (unixtime) = %s \033[0m " %stinfo.st_atime)
print ("\033[1m mtime (unixtime) = %s \033[0m " %stinfo.st_mtime)
print()

##
## Объект "Текущая дата".
##
tobay = date.today()

##
## Объект "Разница во времени"
##
adelta = timedelta(days = DAYS_AGO['atime'])
mdelta = timedelta(days = DAYS_AGO['mtime'])

##
## Объект "Новая дата"
##
target_atime = (tobay - adelta)
target_mtime = (tobay - mdelta)

print("\033[32m target_atime = %s \033[0m " %target_atime)
print("\033[32m target_mtime = %s \033[0m " %target_mtime)
print()

##
## Архаичный формат даты, в виде кортежа.
##
target_atimetuple = target_atime.timetuple()
target_mtimetuple = target_mtime.timetuple()

print("\033[33m target_atimetuple = %s \033[0m " %{target_atimetuple})
print("\033[33m target_atimetuple = %s \033[0m " %{target_mtimetuple})
print()

##
## Количество секунд с начала эпохи Unix (unixtime).
##
new_atime = time.mktime(target_atimetuple)
new_mtime = time.mktime(target_mtimetuple)

print("\033[35m new_atime (unixtime) = %s \033[0m " %new_atime)
print("\033[35m new_mtime (unixtime) = %s \033[0m " %new_mtime)
print()

##
## Изменим atime и mtime
##
os.utime("1.txt",(new_atime, new_mtime))

##  Можно было сразу так:
##      os.utime("1.txt",(1392926400, 1384545600))
##
print("\033[7m  done. \033[0m " )

print()

##
## Опять получим информацию о файле
##
stinfo = os.stat(FILE_NAME)

##
## Покажем atime и mtime
##
print("\033[1m atime (unixtime) =  %s \033[0m " %stinfo.st_atime)
print("\033[1m mtime (unixtime) =  %s \033[0m " %stinfo.st_mtime)
print()

print("\033[7m  ok. \033[0m " )



Исправлений: 6. Последний раз редактировал w-495 в 24.02.2014, 15:03.
Вложения:
открыть | скачать - time-killer.png (46.5 KB)
К сожалению, только зарегистрированные пользователи могут писать в этом форуме.

Авторизоваться на форуме