Консультация № 186150
22.05.2012, 17:06
145.23 руб.
0 15 1
Здравствуйте! У меня возникли сложности с таким вопросом:

Требуется составить программу выполнения заданных действий над файлами на одном из интерпретируемых командных языков ОС UNIX(Shell,CShell,Bash...).

[u]Задание[/u]:
Удаление всех файлов с указанным суффиксом, к которым не было обращений указанное число дней.

Очень нуждаюсь в вашей помощи!

Заранее спасибо!

С уважением,
Иван.

Обсуждение

Неизвестный
22.05.2012, 21:01
общий
это ответ
Здравствуйте, Барс Иван!
Код:
#!/bin/bash

usage()
{
echo -e "Удаляет в текущем каталоге файлы с указанным суффиксом,
к которым не было обращения указанное количество дней.\n
Использовать: $(basename $0) <суффикс> <к-во дней>"
}

if [[ $# -ne 2 ]] ; then
usage
exit 2
fi

suffix="$1"
declare -i days="$2"

# Поиск регулярных файлов с датой доступа более days дней и удаление их(rm).
# Далее поиск в том же каталоге регулярных файлов и модификация времени доступа(touch).
find . -maxdepth 1 -name "*$suffix" -type f -atime "+$days" -exec rm -i {} \;

Неизвестный
22.05.2012, 21:25
общий
Огромное Вам спасибо!
Единственное - подскажите, пожалуйста (давно не писал скрипты), нужно создать текстовый файл а затем запустить его ./XX.sh ?

Заранее спасибо!
Неизвестный
22.05.2012, 23:27
общий
Да. Создаете текстовый файл. Копируете туда текст.
Дальше можно запускать так: >sh <имя файла>
Или дать разрешение на выполнение, а потом уже запускать непосредственно:
Код:
>chmod +x <имя файла>
>./<имя файла>
Неизвестный
23.05.2012, 18:23
общий
У меня при запуске файла просто работает echo ... Что нужно сделать, чтобы проверить программу на работоспособность, подскажите, пожалуйста
Неизвестный
23.05.2012, 18:44
общий
Нужно перейти в каталог, в котором Вы хотите удалить файлы и запустить схожим образом:
Код:
~/Загрузки> ~/PROJECTS/RFPRO/Задачи/186150/186150 ".pdf" 0
rm: удалить обычный файл «./linux_cat109-inst.pdf»? n
rm: удалить обычный файл «./SystemOutRedirectionUsersGuide_v1_0_050905.pdf»? n

В моем случае:
~/PROJECTS/RFPRO/Задачи/186150/186150 - путь к исполняемому файлу
.pdf - суффикс
0 - количество дней

Неизвестный
24.05.2012, 14:30
общий
Вот что выводит:

ivan@ubuntu:~$ emacs l21
ivan@ubuntu:~$ sh l21
l21: 11: [[: not found
l21: 13: declare: not found
find: invalid argument `-exec' to `-atime'

В другом случае:

ivan@ubuntu:~$ chmod +x l21
ivan@ubuntu:~$ ./l21
Удаляет в текущем каталоге файлы с указанным суффиксом,
к которым не было обращения указанное количество дней.

Использовать: l21 <суффикс> <к-во дней>

Простите, если спрашиваю очевидные вещи, не силен в программировании...
Неизвестный
24.05.2012, 19:49
общий
24.05.2012, 19:58
У Вас какой bash в Linux?(наберите: echo $BASH_VERSION)
Или это эмулятор коммандной строки Linux под Windows?

Кстати, должно быть абсолютно одинаково:
Код:
@linux:~> sh xaa
Удаляет в текущем каталоге файлы с указанным суффиксом,
к которым не было обращения указанное количество дней.

Использовать: xaa <суффикс> <к-во дней>


@linux:~> chmod +x ./xaa
@linux:~> ./xaa
Удаляет в текущем каталоге файлы с указанным суффиксом,
к которым не было обращения указанное количество дней.

Использовать: xaa <суффикс> <к-во дней>

@linux:~> ./xaa cnf 3
rm: удалить обычный файл «./.2mandvd.cnf»? n
rm: удалить обычный файл «./.emount.cnf»? n
@linux:~>
Неизвестный
24.05.2012, 23:49
общий
Нет, на Ubunt-e сижу
4.2.8(1) - release
Неизвестный
24.05.2012, 23:59
общий
Ой, еще забыл кое-что
Возможно ли сделать так, чтобы программа удовлетворяла как минимум 2 из этих условий?

1)Если параметры опущены,то их значения должны быть запрошены у пользователя
2)Программа должна в случае ошибки в задании параметров выводить комментированный синтаксис правильного пользования
3)Если указан параметр "?", то выводится подсказка (спецификация программы)
4)Программа должна обеспечивать возможность установки режима трассировки
5)Программа должна обеспечивать возможность установки режима подтверждения
6)Программа долдна обеспечивать возможность исправления значений параметров после запуска в диал.режиме
7)Программа должна обеспечивать позиционный способ задания параметров(список слов через пробел или запятую)
8)Если парам. опущены, то устанавливаются некоторые стандартные значения параметров
9)Программа должна обеспечивать задание списка ключевых параметров в формате имя=значение через запятую
10)Задание параметров в конфигурационном файле

Если Вам не сложно, пожалуйста, реализуйте 2 любых условия
Неизвестный
25.05.2012, 00:21
общий
Программа удовлетворяет условиям 3 и 8(суффикс:любой,дней:0)
Код:
#!/bin/bash

usage()
{
echo -e "Удаляет в текущем каталоге файлы с указанным суффиксом,
к которым не было обращения указанное количество дней.\n
Использовать: $(basename $0) <суффикс> <к-во дней>"
}

if [[ "$1". == "?". ]] ; then
usage
fi

suffix="$1"
declare -i days="$2"

# Поиск регулярных файлов с датой доступа более days дней и удаление их(rm).
# Далее поиск в том же каталоге регулярных файлов и модификация времени доступа(touch).
find . -maxdepth 1 -name "*$suffix" -type f -atime "+$days" -exec rm -i {} \;
Неизвестный
27.05.2012, 01:56
общий
Прошу прощения, а можно еще попросить об одной услуге?
Если Вам не сложно, пожалуйста, объясните вторую часть программы (начиная с suffix="$1" и заканчивая -exec rm -i {} \;), т.е. непосредственно механику работы программы (что такое declare, maxdepth, atime...)

Заранее спасибо!
Неизвестный
27.05.2012, 09:03
общий
27.05.2012, 09:05
suffix="$1" - 1й параметр присваивается переменной suffix
declare -i days = "$2" - хотя в bash нет строгой типизации, тем не менее этот оператор говорит о том, что days-целочисленная переменная. В случае отсутствия $2 или неверного формата для целых days будет равно 0(ниче другого кроме целого числа она содержать не будет)
find - команда поиска(man find - для страницы руководства). Эта комманда поддерживает кучу параметров. Именно в ней все и происходит.
. - каталог поиска - текущий
-maxdepth 1 - глубина поиска find. т.е. на сколько find будет спускаться в подкаталоги. В данном случае не будет вообще. Поиск ведется только в текущем каталоге. Если убрать - будет спускаться рекурсивно во все каталоги начиная с текущего
-name "*$suffix" - имя файла задано шаблоном - должно заканчиваться на $suffix.
-type f - тип файлов - регулярные файлы
-atime "+$days"- время последнего доступа более $days дней
-exec - этот параметр позволяет указать комманде find формат комманды которую требуется выполнить для каждого найденного файла.
rm -i {} \; - сама комманда, где знак {} будет заменет коммандой find на реальное имя файла.

Читайте: man find
Неизвестный
27.05.2012, 15:19
общий
Еще раз огромное спасибо, во всем разобрался!
Только один последний нюанс - зачем -i в строке rm -i {} \; ?
Неизвестный
27.05.2012, 15:41
общий
27.05.2012, 15:44
Для того, чтоб rm спрашивала удалять файл или нет. Можно убрать -i, но это может быть неприятно в случае ошибки. Напр. запуск скрипта от root где нибудь в /bin, /usr/bin, /sbin, /boot, /lib и т.п. Т.к. удалятся системные файлы. Или у себя в каталоге с нужными файлами.

В общем, это сделано для Вас, чтоб не жаловались.
Неизвестный
27.05.2012, 16:43
общий
Понял
Большое спасибо!
Форма ответа