Pull to refresh

bash-сценарий: отчистка от мусора

все началось с того что я распаковал архив…
Да не просто распаковал, а распаковал в исходную папку, где и так было много мусора.
а архив был не маленький и не из одного файла состоящий, поэтому искать каждый файл по отдельности мне было лень.
был я маленький и глупый (хотя, что изменилось?) сидел тогда под ubuntu'ой, почти не знал bash и сам не писал сценарии.
И вот тогда у меня родилась идея о том чтобы написать скрипт который будет искать файлы из одной директории, находящиеся в другой директории. Ну родилась мысль и родилась, я не особо к ней прицепился и все таки удалил файлы, которые нашел (а нашел не все, как потом выяснилось).

и вот однажды лазая по просторам интернета, и других источников информации. я накопился опыта и написал тот самый сценарий — мой первый bash-сценарий который мне действительно был нужен.
Языков программирования я знаю не то чтобы много но достаточно для того чтобы иметь представление о программировании, вот я предлагаю вам мой код(авось что перепадет;-) ), с активными комментариями:

#!/bin/bash
# bash-сценарий, поиска одинаковых файлов между двумя директориями

# первый параметр - исходная директория, файлы из которой мы ищем
sourcedir="$1"

# второй параметр - директория поиска, где должны быть найдены повторяющиеся
# файлы, которые при особом желании, могут удалится

checkdir="$2"

##########################################
# раскомментировать чтобы писать все в лог

# userlogfile="/home/$USER/log.txt"
##########################################
# если исходная и проверяемая директории одинаковы

logf="/home/denis/tmp.log"
if [ "X$sourcedir" = "X$checkdir" ]
then
# они могут быть пустые
if ! [ -e "$sourcedir" -o -e "$checkdir" ]
then

# тогда выводим сообщение о том что нужно ввести путь к директориям
echo "введите путь к директории(ям)"
# и выходим с ошибкой
exit 2
else # если они просто одинаковые, и не пустые

# выводим сообщение о том что директории одинаковые
echo "директории $sourcedir и $checkdir совпадают"
fi # конец условия одинаковости

# если введенные директории существуют
elif [[ -d "$sourcedir" && -d "$checkdir" ]]
then
# запускаем функцию поиска и удаления повторяющихся файлов

# анализ исходной директории
echo "исходная директория : $sourcedir" >> "$logf"
# подсчет количества файлов в исходной директории
cnt1=`ls "$sourcedir" | wc -l`
# отображение списка файлов
echo `ls "$sourcedir"` >> "$logf"
# отображение количества файлов
echo "$cnt1 файлов в исходной директории" >> "$logf"
# анализ проверяемой директории
echo "проверяемая директория : $checkdir" >> "$logf"
# подсчет количества файлов внутри директории
cnt2=`ls "$checkdir" | wc -l`
# отображение списка файлов
echo `ls "$checkdir"` >> "$logf"
# отображение количества файлов
echo "$cnt2 файлов в проверяемой директории" >> "$logf"
# обнуление найденных файлов и директорий
cntfile=0
cntdir=0
# запуск цикла поиска
for file in `ls "$sourcedir"`
do
# если нашел файл
if [ -e "$checkdir/$file" ]
then
# и если этот файл директория
if [[ -d "$checkdir/$file" ]]
then
# увеличить количество найденных файлов на 1
cntdir=$(($cntdir+1))
# написать что нашли директорию
echo "найдена директория: $checkdir/$file" >> "$logf"
# написать информацию о директории
echo "информация: " >> "$logf"
# отобразить атрибуты директории
echo `ls -ld "$checkdir/$file"` >> "$logf"
# запустить проверку найденной директории
echo "проверка похожей директории" >> "$logf"
# рекурсивный запуск сценария для вложенной папки
./$0 "$sourcedir/$file" "$checkdir/$file"
else # если это все-таки файл
# увеличить количество найденных файлов на 1
cntfile=$(($cntfile+1))
# вывести сообщение о том что найден файл
echo "найден файл: $checkdir/$file" >> "$logf"
# вывести информацию о файле
echo "информация: " >> "$logf"
# написать тип файла
echo `file "$checkdir/$file"` >> "$logf"
# написать атрибуты файла
echo `ls -l "$checkdir/$file"` >> "$logf"
# удалить файл с вопросом об удалении
rm -i "$checkdir/$file"
fi # конец условия о директории или файле
# установить шрифт по умолчанию
tput sgr0
fi # конец условия о том что, найден файл, конец его обработки
done # конец цикла
# если количество найденных файлов меньше или рано 0 (а вот вдруг)
if [ "$cntfile" -le "0" ]
then
# то написать что файлы для удаления не найдены
echo "повторяющиеся файлы не найдены" >> "$logf"
# иначе если количество найденных файлов больше
elif [ "$cntfile" -gt "0" ]
then
# то написать о том сколько их
echo "найдено $cntfile файл(ов)" >> "$logf"
fi # конец записей о файлах
# если количество найденных директорий меньше или рано 0 (ну так получилось)
if [ "$cntdir" -le "0" ]
then
# то сообщить о том что директорий не найдено
echo "повторяющихся директорий не найдено" >> "$logf"
# иначе, если нашлись
elif [ "$cntdir" -gt "0" ]
then
# сообщить сколько найдено
echo "найдено $cntdir директорий" >> "$logf"
fi # конец записей о найденных директориях
fi #конец всего поиска
# проверяем была ли директория у лога
if [ "$userlogfile" = '' ]
then
# если нет, то пишем все на стандартный вывод
cat "$logf"
else
# если да, то в лог
cat "$logf" >> "$userlogfile"
fi # конец условия логирования
# удаление временного лога
rm -f "$logf"
# выход
exit 0



— да, скажите вы, но команда в одну строчку
$ list=`ls`; myfind=`find. -name $list`; rm -i $myfind
делается быстрее, а эффект от нее приблизительно тот же
— да, но ведь так не интересно, да и к тому же find не ведет лог(или я не прав?), у меня конечно тоже не шедевр, но это ж первый сценарий а не какая нибудь программа в массы, поэтому не судите строго… то есть судите попроще
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.