LINUX.ORG.RU

История изменений

Исправление megabaks, (текущая версия) :

пока родилось это

#!/bin/bash

SRC="/usr/src/linux"
KERNELS="$(file /boot/* | grep version)"
############################################################################
####### kernel path and real name ##########################################
kernel_version() {
makefile="${SRC}-${1}/Makefile"
  if [ -f "${makefile}" ];then
	VERSION="$(awk '/^VERSION =/ {print $3}' "${makefile}")"
	PATCHLEVEL="$(awk '/^PATCHLEVEL =/ {print $3}' "${makefile}")"
	SUBLEVEL="$(awk '/^SUBLEVEL =/ {print $3}' "${makefile}")"
	EXTRAVERSION="$(awk '/^EXTRAVERSION =/ {print $3}' "${makefile}")"
	FULL_KERNEL="${VERSION}.${PATCHLEVEL}.${SUBLEVEL}${EXTRAVERSION}"
  fi
}

true_kernel() {
  if [ -n "${1}" ];then
	KERNEL="${1##*linux-}"
	KERNEL="${KERNEL%/}"
  fi

  if [ -d "${SRC}-${KERNEL}" ];then
	kernel_version ${KERNEL}
  else
	for kernel in `ls -d --color=never /usr/src/linux-*`;do
	  kernel="${kernel##*/linux-}"
	  kernel_version ${kernel}
	  if [ "${KERNEL}" == "${FULL_KERNEL}" ];then
		kernel_version ${kernel}
		KERNEL="${kernel}"
		break
	  fi
	done
  fi
}
############################################################################

while read line;do
  FILE="`awk '{print $1}' <<< "${line}"`"
  FILE="${FILE%:}"
  version="`awk '{print $9}' <<< "${line}"`"
  true_kernel ${version}

  [ -d "/lib/modules/${version}" ] || REMOVE_FILES+="${FILE}\n"

  [ -d "${SRC}-${KERNEL}" ] || REMOVE_FILES+="${FILE}\n"

  if [ -d "${SRC}-${KERNEL}" ];then
	if ! [ -f "${SRC}-${KERNEL}/COPYING" ];then
	  REMOVE_DIRS+="${SRC}-${KERNEL}\n"
	fi
  fi
done <<< "${KERNELS}"

VERSIONS="$(awk '{print $9}' <<< "${KERNELS}")"
for mod_dir in `ls -1 --color=never /lib/modules/ | grep -v "${VERSIONS}"`;do
  REMOVE_MOD_DIRS+="/lib/modules/${mod_dir}\n"
done

for src_dir in `ls -d1 --color=never ${SRC}*`;do
  [ -f "${src_dir}/COPYING" ] || REMOVE_DIRS+="${src_dir}\n"
done

echo -e "\nБудут удалены следующие файлы:\n"
echo -e "${REMOVE_FILES}" | sort -u | sed '/^$/d'

echo -e "\nБудут удалены следующие диры:\n"
echo -e "${REMOVE_DIRS}" | sort -u | sed '/^$/d'
echo -e "${REMOVE_MOD_DIRS}" | sort -u | sed '/^$/d'
запускать можно от юзверя - он пока ничего не далает - просто матерится
sh kernel-cleaner/kernel-cleaner

Будут удалены следующие файлы:

/boot/3.1.5-pf
/boot/3.1.5-pf1
/boot/3.1.6-pf
/boot/3.2.1-pf
/boot/3.2.1-r2-pf
/boot/3.2.4-pf
/boot/3.2.7-pf
/boot/3.3.2-pf
/boot/3.3.6-pf
/boot/3.4.3-pf
/boot/3.4.3-pf-uksm
/boot/3.4.5-pf-uksm

Будут удалены следующие диры:

/usr/src/linux-2.2.2-ololo
/usr/src/linux-3.3.6-pf
/lib/modules/3.2.1-ololo
/lib/modules/3.2.1-trololo
файлы - те ядра, что не имеют диры с модулями
диры с модулями те, что не фигурируют в ядрах из /boot
+сорс-диры те, что не имеют файл COPYING, т.к. этот файл удаляется портажем как часть сорсов ядра, т.е. это диры от уже удалённых ядер с хламом от сборки
вроде всё...
потестите и напишите - правильно ли оно работает

Исходная версия megabaks, :

пока родилось это

#!/bin/bash

SRC="/usr/src/linux"
KERNELS="$(file /boot/* | grep version)"
############################################################################
####### kernel path and real name ##########################################
kernel_version() {
makefile="${SRC}-${1}/Makefile"
  if [ -f "${makefile}" ];then
	VERSION="$(awk '/^VERSION =/ {print $3}' "${makefile}")"
	PATCHLEVEL="$(awk '/^PATCHLEVEL =/ {print $3}' "${makefile}")"
	SUBLEVEL="$(awk '/^SUBLEVEL =/ {print $3}' "${makefile}")"
	EXTRAVERSION="$(awk '/^EXTRAVERSION =/ {print $3}' "${makefile}")"
	FULL_KERNEL="${VERSION}.${PATCHLEVEL}.${SUBLEVEL}${EXTRAVERSION}"
  fi
}

true_kernel() {
  if [ -n "${1}" ];then
	KERNEL="${1##*linux-}"
	KERNEL="${KERNEL%/}"
  fi

  if [ -d "${SRC}-${KERNEL}" ];then
	kernel_version ${KERNEL}
  else
	for kernel in `ls -d --color=never /usr/src/linux-*`;do
	  kernel="${kernel##*/linux-}"
	  kernel_version ${kernel}
	  if [ "${KERNEL}" == "${FULL_KERNEL}" ];then
		kernel_version ${kernel}
		KERNEL="${kernel}"
		break
	  fi
	done
  fi
}
############################################################################

while read line;do
  FILE="`awk '{print $1}' <<< "${line}"`"
  FILE="${FILE%:}"
  version="`awk '{print $9}' <<< "${line}"`"
  true_kernel ${version}

  [ -d "/lib/modules/${version}" ] || REMOVE_FILES+="${FILE}\n"

  [ -d "${SRC}-${KERNEL}" ] || REMOVE_FILES+="${FILE}\n"

  if [ -d "${SRC}-${KERNEL}" ];then
	if ! [ -f "${SRC}-${KERNEL}/COPYING" ];then
	  REMOVE_DIRS+="${SRC}-${KERNEL}\n"
	fi
  fi
done <<< "${KERNELS}"

VERSIONS="$(awk '{print $9}' <<< "${KERNELS}")"
for mod_dir in `ls -1 --color=never /lib/modules/ | grep -v "${VERSIONS}"`;do
  REMOVE_MOD_DIRS+="/lib/modules/${mod_dir}\n"
done

for src_dir in `ls -d1 --color=never ${SRC}*`;do
  [ -f "${src_dir}/COPYING" ] || REMOVE_DIRS+="${src_dir}\n"
done

echo -e "\nБудут удалены следующие файлы:\n"
echo -e "${REMOVE_FILES}" | sort -u | sed '/^$/d'

echo -e "\nБудут удалены следующие диры:\n"
echo -e "${REMOVE_DIRS}" | sort -u | sed '/^$/d'
echo -e "${REMOVE_MOD_DIRS}" | sort -u | sed '/^$/d'
запускать можно от юзверя - он пока ничего не далает - просто матерится
sh kernel-cleaner/kernel-cleaner

Будут удалены следующие файлы:

/boot/3.1.5-pf
/boot/3.1.5-pf1
/boot/3.1.6-pf
/boot/3.2.1-pf
/boot/3.2.1-r2-pf
/boot/3.2.4-pf
/boot/3.2.7-pf
/boot/3.3.2-pf
/boot/3.3.6-pf
/boot/3.4.3-pf
/boot/3.4.3-pf-uksm
/boot/3.4.5-pf-uksm

Будут удалены следующие диры:

/usr/src/linux-2.2.2-ololo
/usr/src/linux-3.3.6-pf
/lib/modules/3.2.1-ololo
/lib/modules/3.2.1-trololo
файлы - те, что не имеют диры с модулями
диры с модулями те, что не фигурируют в ядрах из /boot
+сорс-диры те, что не имеют файл COPYING, т.к. этот файл удаляется портажем как часть сорсов ядра, т.е. это диры от уже удалённых ядер с хламом от сборки
вроде всё...
потестите и напишите - правильно ли оно работает