![]() |
Сила shell'ов
Вот написал скриптик:
Спойлер
#/bin/bash # Script for cleaning old Debian packaged # Author: Igor Pellinen (Russia) aka Igron aka tmp0000 # First, create file with Packages dpkg-scanpackages . /dev/null > Packages 2>/dev/null # Make temporary directory mkdir temp_dir_with_new_packages # Move actual files to temporary directory for i in `awk '/^Filename:/ {print $2}' Packages`; do test -f $i && mv $i ./temp_dir_with_new_packages/; done # Delete old Debian packages, they are in current directory rm -f ./*.deb # Now, after deleting old packages, we must back actual packages back to the current directory: cd ./temp_dir_with_new_packages/ for i in *.deb; do mv $i ../; done cd ../ # Remove temporary directory and packages files rmdir temp_dir_with_new_packages rm Packages Он занимается тем, что удаляет старые deb-пакеты, если существуют пакеты более новых версий. Сам знаю, что все довольно топорно и неэффективно в плане скорости (создается временная директория, туда перемещаются нужные (актуальные) пакеты, удаляются старые, затем все перемещается назад. Как можно улучшить скорость работы скрипта? |
Не прокатит такой вариант:в очищаемой папке создать файлик old-debs и при нахождении старого пакета записать в него remove /path/to/old/deb/ и интер :) и так по циклу, а потом просто запустить этот скрипт :) Или бред?
|
Код:
#!/bin/bash |
Цитата:
|
greiv, если бы он мог это сделать, то не заморачивался бы с написанием скриптов. :) Вообще, чтобы "вкурить" что он хочет автоматизировать, надо примерно знать как устроены и создаются репозитории debian/ubuntu и как там нумеруются версии пакетов.
|
rmn, а ты внимательно прочитай, что он в скобках написал - ...туда перемещаются нужные (актуальные) пакеты. Т.е. все же он их различает актуальные-то. Или он просто выразился не правильно.
|
greiv, я внимательно читал, более того - этой фигней занимался уже.
Есть каталог, в него навалена куча deb-пакетов различных версий, например, foo 0.40, foo 0.41, foo 0.41 backported. Пакетов для простоты - 1000 штук по 3-4 версии каждого. Из них в каталоге нужно оставить только "актуальные" пакеты (вроде foo 0.41). dpkg-scanpackages, грубо говоря, выдаёт список "актуальных" пакетов. Задача сводится к тому, чтобы из начального списка вычленить неактуальные, используя шелл. |
rmn, ну цель-то понятна=), раз dpkg-scanpackages такой хороший, что выплевывает список "актуальных" пакетов, то зачем нужна свистопляска с отдельными директориями и перемещениями по тысячу раз... как будто неактуальные нельзя замочиь в том же каталоге
|
greiv, мне не совсем понятно, что ты предлагаешь. Шелл-сценарий для решения задачи в студию. :)
|
Цитата:
|
Цитата:
|
Frosty, опять напилсо. попробуй его с утра запустить. :]
|
Цитата:
|
Цитата:
|
Frosty, дык .gz надо развернуть предварительно. Либо прямо в скрипте изменить строку так:
Код:
zcat Packages.gz | awk '/^Filename: / {print $2}' | sort > new.listДобавлено через 14 часов 31 минуту Frosty, все-таки решил проверить на себе код ;) чтобы 100% работало без собственноручных доводок, нужно подправить строку Код:
ls -1 ./*.deb | sort > old.list |
полностью от начала и до конца выложи скрипт, а то опять тренироваца не хочется :)
|
Цитата:
|
код
должно работать :) но проверять сейчас времени нет. |
Цитата:
Код:
frosty@frosty-desktop:~/Desktop/неозаглавленная папка$ sudo sh "/home/frosty/Desktop/неозаглавленная папка/clean"Цитата:
Цитата:
|
Frosty, скрипт написан на bash, а ты его запускаешь через sh. RTFM :)
|
Все, работает, идеально ;)
|
Хех, запустил скрипт rmn'a в папке с пакетами-моментальный Shift+Delete всей папки, смешно блин, видимо придеца опять выкачивать пару часов все архивы :)
Скрипт удаляет все.deb |
Frosty, да-да, деструкция - наше фсё. :]
переделай скрипт, чтобы он не удалял, а перемещал пакеты в отдельный каталог. |
Если запукать скрипт через консоль из сухого и темного места, то все работает нормально, а ели из папки с пакетами, то приходица качать заново :)
|
Скрипт для массового переименования файлов с неправильными названиями
Спойлер
#/bin/bash #Script that renames deb-packages that have bad filenames. #Author: Igor Pellinen (Russia) aka Igron aka tmp0000 && Vadim Gusev (Russia) aka Frosty #First we do a textfile that contains wrong filenames find . -name '*%3a*' > wrong.names #Rename files, mask [0-9]%3a is changed to nothing for i in `grep %3a wrong.names`; do mv $i `echo $i | awk '{gsub("[0-9]%3a","");print }'` ; done #Remove temporary textfile rm wrong.names #All done. What are waiting to see here? :) |
Подскажите, пожалуйста, необходимо для определённой директории сделать следующее:
- всем каталогам присвоить права 755 - всем файлам присвоить права 644 |
dotpack,
Код:
find /определенная/директория/ -type d -exec chmod 755 {} \; |
Возник вопросец: вывести все директории в текущей дире.
Код:
for i in *; do test -d $i && echo $i; doneКод:
bash: test: слишком много аргументовОффтоп
|
Цитата:
Код:
for i in *; do test -d "$i" && echo $i; done |
золотое правило шелл-программинга - кавычить переменные. Во избежание.
|
Недавно пришлось переустанавливать систему и, чтобы потом не перекачивать заново 2,5 Гб, решил забекапить кэш, предварительно почистив его от пакетов старых версий.
К сожалению, aptitude autoclean удаляет старые пакеты, даже если они находятся в количестве одной версии, поэтому решил было использовать dpkg-scanpackages, как показано несколькими постами выше, немного оптимизировав код: Код:
dpkg-scanpackages archives 2>&1 | grep -e '^ !.*is repeat;' | \И всё-таки, dpkg-scanpackages работает достаточно медленно, к тому же требует установки дополнительных пакетов, поэтому немного поразмыслив, написал ещё 1 сценарий: Код:
ls -1 archives/*.deb | while read |
Вот такая задача:
Находится с помощью поиска (find) перечень неких каталогов, и необходимо подсчитать количество этих каталогов (с помощью команды wc) и вывести этот перечень на экран вместе с их количеством. Реально ли это сделать? По отдельности то всё работает ) |
ну, если "в лоб", то так
Код:
list="`find . -type d критерии поиска неких каталогов`"; \ |
rmn, не работает ) echo "$list" просто печатает собственно строку find блаблабла, ито без этого - \
|
Mornis, первый аргумент у find - корневой каталог поиска. В примере это текущий каталог (ему соответствует точка в шелле). Соответственно, точку надо заменить на каталог, о котором идёт речь в задании. Например, корневой /.
Во-вторых, критерии поиска тоже нужно сформулировать согласно синтактису команды find. Критерии поиска мне не ведомы. ;) В-третьих, важен порядок, тип и кол-во кавычек. Шелл к этому чувствителен. :) Если всё это в порядок привести, то работать должно. |
rmn, во первых, я додумалась до того чтобы написать в поиске всё что нужно :) во вторых всё остальное ввела так же как у вас, но не работает ) кстати другого способа нет? ато можно ещё два раза поиск написать, то же самое будет
|
Mornis, какой шелл? версия? Вообще, лучше всё это сразу приводить. И задание дословно, и команда, которая в шелле исполнялось. Иначе разговор слепого с глухим получается.
|
версия там:
Код:
/bin/bash --helpКод:
list="`find /home -type d `";echo "$list"; echo "$list" | wc -lКод:
user@xxx:~> list="`find ~ -type d `";echo "$list"; echo "$list" | wc -lДобавлено через 2 минуты ps. -maxdepth 1 добавь а то там где ты ищещь запаришься искать ;) |
В последнее время только и занимаюсь тем, что качаю клипы с трубы.
Накидал скриптик для автоматического получения названия песни с трубы и переименования файлов. Спойлер
#!/bin/bash # ver. 0.1.0 # Script for collecting info from truba videos and rename files # Author: Igor Pellinen <igronus[at]gmail[dot]com> # Licence: GPL3+ # Directories CLIPS_DIRECTORY="/home/igron/newclips/" # Log file LOG_DIRECTORY="/home/igron/" LOG_FILE=".truba-parser.log" # Create a new log file if it doesn't exist cd "$LOG_DIRECTORY" [ -e "$LOG_FILE" ] if [ $? -eq 1 ]; then echo "It seems like log file does not exist, creating..." touch "$LOG_FILE" fi # Adding start time to log echo "`date` Truba-parser started" >> "$LOG_DIRECTORY"/"$LOG_FILE" # Start process cd "$CLIPS_DIRECTORY" for file_name in * do # File extension extension=`echo ${file_name##*.}` # File name without extension file_short_name=`echo ${file_name%.*}` # Get html file from truba wget "http://truba.karelia.ru/video.php?id=$file_short_name" -O temp.file # Parse info from html file string=`cat temp.file | sed '1,/<head>/d' | sed '2,/<\/html>/d'` string_utf=`echo $string | iconv -f koi8-r -t utf8` length=`echo ${#string_utf}` new_length=`echo "$length-15" | bc` new_name=`echo ${string_utf:7:$new_length}` new_full_name=$new_name"."$extension # Log and process rename echo "Renaming $file_name to $new_full_name..." >> "$LOG_DIRECTORY"/"$LOG_FILE" mv "$file_name" "$new_full_name" # Removing temporary html file rm temp.file done # Adding end time to log echo "`date` Truba-parser finished" >> "$LOG_DIRECTORY"/"$LOG_FILE" Схема такая: URL клипов находится в файле, клипы льются по списку в каталог $CLIPS_DIRECTORY wget'ом, после чего данный скрипт их переименовывает как надо. PS. No warranty, just idea. Use at your own risk. |
Люди нужна помощь в переделывание скрипта.
есть такой скрипт Цитата:
Цитата:
|
| Текущее время: 11:32. Часовой пояс GMT +3. |
Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot