Тестирование ЛР 20 и ЛР 21 15 February 2014 09:09 |
Зарегистрирован: 10 лет назад Сообщений: 74 |
#!/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;
Re: Тестирование ЛР 20 и ЛР 21 16 February 2014 22:10 |
Зарегистрирован: 10 лет назад Сообщений: 74 |
#!/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;
Re: Тестирование ЛР 20 и ЛР 21 24 February 2014 15:03 |
Зарегистрирован: 10 лет назад Сообщений: 74 |
# !/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 " )