все началось с того что я распаковал архив…
Да не просто распаковал, а распаковал в исходную папку, где и так было много мусора.
а архив был не маленький и не из одного файла состоящий, поэтому искать каждый файл по отдельности мне было лень.
был я маленький и глупый (хотя, что изменилось?) сидел тогда под ubuntu'ой, почти не знал bash и сам не писал сценарии.
И вот тогда у меня родилась идея о том чтобы написать скрипт который будет искать файлы из одной директории, находящиеся в другой директории. Ну родилась мысль и родилась, я не особо к ней прицепился и все таки удалил файлы, которые нашел (а нашел не все, как потом выяснилось).
и вот однажды лазая по просторам интернета, и других источников информации. я накопился опыта и написал тот самый сценарий — мой первый bash-сценарий который мне действительно был нужен.
Языков программирования я знаю не то чтобы много но достаточно для того чтобы иметь представление о программировании, вот я предлагаю вам мой код(авось что перепадет;-) ), с активными комментариями:
— да, скажите вы, но команда в одну строчку
$ list=`ls`; myfind=`find. -name $list`; rm -i $myfind
делается быстрее, а эффект от нее приблизительно тот же
— да, но ведь так не интересно, да и к тому же find не ведет лог(или я не прав?), у меня конечно тоже не шедевр, но это ж первый сценарий а не какая нибудь программа в массы, поэтому не судите строго… то есть судите попроще
Да не просто распаковал, а распаковал в исходную папку, где и так было много мусора.
а архив был не маленький и не из одного файла состоящий, поэтому искать каждый файл по отдельности мне было лень.
был я маленький и глупый (хотя, что изменилось?) сидел тогда под 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 не ведет лог(или я не прав?), у меня конечно тоже не шедевр, но это ж первый сценарий а не какая нибудь программа в массы, поэтому не судите строго… то есть судите попроще