LINUX.ORG.RU

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

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

Мусор в системе - понятие очень неоднозначное. ._cfg* - это мусор? Логи? Твои скрипты в /usr/local/bin? Файлы ядра в /boot?

На самом деле, самый неприятный «мусор» - лишние пакеты в /usr/portage/packages . Здесь я нашел рецепт как избавляться от лишнего, нужно будет как-то преобразовать это в скриптик. Еще скопление мусора в домашних каталогах - кеши, временные файлы и т. п. А общесистемный... Ладно давай попробуем...

Немного подмодифицировал твой скриптик...
- Все файлы и каталоги - в переменные. Так наглядней, да и помогает избежать некоторых проблем. Каталог делаем по-настоящему уникальным.
- Файлы в пакетах ищутся очень долго (equery f) . Так ты будешь делать отладку вечность. Вводим DEBUG режим - использование предыдущих наработок и, соответственно, не-удаление этих файлов в конце. Также, если DEBUG режим выключен - создавать уникальный каталог в /tmp . WARNING: Если честно, не тестировал с выключенным DEBUG режимом - лень. Оставлю тебе :)
- Поиск: лучше использовать принцип «Все, что не запрещено - то разрешено». Исключение для поиска - в отдельной переменной $EXCLUDE_PATH .
- Поиск: не понятно, что делать с симлинками, такими как /etc/bash_completion.d/eselect . Пока не добавлял.
- Не вижу ничего плохого в том, что от equery не парсятся каталоги (хотя я нашел рецепт как это сделать).
- Немного оптимизировал алгоритм поиска. Даже с ! -path оно ищет везде, это просто фильтр для вывода; пофиксил это.
- Немного очеловечил вывод diff.
- Пока скрипт создает временные файлы в текущем каталоге - см. переменную TMP_DIR .
- Результат - в garbage.txt.

Если честно, результаты неоднозначные. Например, многие файлы в /etc/ не принадлежат ни к одному пакету. /usr/lib/perl5/5.18.2/i686-linux/bits/* не принадлежат ни к кому; мне как-то не очень хочется их удалять, скорее всего они просто сгенерированы динамически каким-то perl-cleaner'ом. Аналогично с python'ом. Mime-типы. В исключения их? Очевидного мусора не так уж и много. Все-же в unix хорошо продуманная fhs, мусора практически не появляется. Ну, или это Gentoo такая продуманная, что тоже может быть ;)

Поразмял мозг в воскресенье :) . ИМХО, скрипт полезен скорее с точки зрения изучения строения системы.

Вот:

#!/bin/bash

# Debug mode
DEBUG="yes" # Make it empty to switch off debug mode

# System config
EXCLUDE_PATH="
/boot
/dev
/home
/lib/modules
/media
/mnt
/proc
/run
/sys
/usr/local
/usr/portage
/usr/src
/tmp
/var
"

# Variables
# TMP_DIR="/tmp/garbage"
TMP_DIR="."
TMP_PACKAGES="packages.txt"
TMP_PACKAGE_FILES="package_files.txt"
TMP_PACKAGE_FILES2="package_files2.txt"
TMP_SYSTEM_FILES="system_files.txt"
TMP_RESULT="garbage.txt"

# Implementation
[[ -n "$DEBUG" ]] && echo "Debug mode is ON"
[[ -z "$DEBUG" ]] && TMP_DIR=`mktemp` # Make unique directory

mkdir "${TMP_DIR}" 2> /dev/null # Be silent if the directory already exists

TMP_PACKAGES="$TMP_DIR/$TMP_PACKAGES"
TMP_PACKAGE_FILES="$TMP_DIR/$TMP_PACKAGE_FILES"
TMP_PACKAGE_FILES2="$TMP_DIR/$TMP_PACKAGE_FILES2"
TMP_SYSTEM_FILES="$TMP_DIR/$TMP_SYSTEM_FILES"
TMP_RESULT="./$TMP_RESULT"

if [[ -f "$TMP_PACKAGES" ]] ; then 
	echo "Using existing package list..."
else
	echo "Looking for packages..."
	EIX_LIMIT=0 eix -#I > "$TMP_PACKAGES"
fi

if [[ -f "$TMP_PACKAGE_FILES" ]] ; then 
	echo "Using existing files list..."
else
	echo "Looking for files in packages..."
	rm "$TMP_PACKAGE_FILES" 2> /dev/null
	
	cat "$TMP_PACKAGES" | while read line; do
		echo "Processing '$line'..."
		equery f $line | grep "^/" >> "$TMP_PACKAGE_FILES2"
	done
	cat "$TMP_PACKAGE_FILES2" | grep -v "/usr/src" | sort | uniq > "$TMP_PACKAGE_FILES"
fi

echo "Listing files in the system..."

# Some optimization
FIND_CMD="find / -maxdepth 1 -type d ! -path /"
for E in $EXCLUDE_PATH ; do
	FIND_CMD="$FIND_CMD ! -path $E" 
done
FIND_CMD="$FIND_CMD -printf %p\40"
[[ -n "$DEBUG" ]] && echo "Find command 1: $FIND_CMD"

FIND_DIRS=`$FIND_CMD`
[[ -n "$DEBUG" ]] && echo -e "\n$FIND_DIRS\n"

# Main code
FIND_CMD="find $FIND_DIRS -type f "
for E in $EXCLUDE_PATH ; do
	FIND_CMD="$FIND_CMD ! -path \"$E/*\"" 
done
[[ -n "$DEBUG" ]] && echo "Find command 2: $FIND_CMD"
eval "$FIND_CMD" | sort | uniq > "$TMP_SYSTEM_FILES"

diff "$TMP_SYSTEM_FILES" "$TMP_PACKAGE_FILES" | grep "^<" | sed "s/^< //g" > "$TMP_RESULT"

[[ -z "$DEBUG" ]] && rm -rf "TMP_DIR"

Исправление Kroz, :

Мусор в системе - понятие очень неоднозначное. ._cfg* - это мусор? Логи? Твои скрипты в /usr/local/bin? Файлы ядра в /boot?

На самом деле, самый неприятный «мусор» - лишние пакеты в /usr/portage/packages . Здесь я нашел рецепт как избавляться от лишнего, нужно будет как-то преобразовать это в скриптик. Еще скопление мусора в домашних каталогах - кеши, временные файлы и т. п. А общесистемный... Ладно давай попробуем...

Немного подмодифицировал твой скриптик...
- Все файлы и каталоги - в переменные. Так наглядней, да и помогает избежать некоторых проблем. Каталог делаем по-настоящему уникальным.
- Файлы в пакетах ищутся очень долго (equery f) . Так ты будешь делать отладку вечность. Вводим DEBUG режим - использование предыдущих наработок и, соответственно, не-удаление этих файлов в конце. Также, если DEBUG режим выключен - создавать уникальный каталог в /tmp . WARNING: Если честно, не тестировал с выключенным DEBUG режимом - лень. Оставлю тебе :)
- Поиск: лучше использовать принцип «Все, что не запрещено - то разрешено». Исключение для поиска - в отдельной переменной $EXCLUDE_PATH .
- Поиск: не понятно, что делать с симлинками, такими как /etc/bash_completion.d/eselect . Пока не добавлял.
- Не вижу ничего плохого в том, что от equery не парсятся каталоги (хотя я нашел рецепт как это сделать).
- Немного оптимизировал алгоритм поиска. Даже с ! -path оно ищет везде, это просто фильтр для вывода; пофиксил это.
- Немного очеловечил вывод diff.
- Пока скрипт создает временные файлы в текущем каталоге - см. переменную TMP_DIR .
- Результат - в garbage.txt.

Если честно, результаты неоднозначные. Например, многие файлы в /etc/ не принадлежат ни к одному пакету. /usr/lib/perl5/5.18.2/i686-linux/bits/* не принадлежат ни к кому; мне как-то не очень хочется их удалять, скорее всего они просто сгенерированы динамически каким-то perl-cleaner'ом. Аналогично с python'ом. Mime-типы. В исключения их? Очевидного мусора не так уж и много. Все-же в unix хорошо продуманная fhs, мусора практически не появляется. Ну, или это Gentoo такая продуманная, что тоже может быть ;)

Поразмял мозг в воскресенье :) . ИМХО, скрипт полезен скорее с точки зрения изучения строения системы.

Вот:

#!/bin/bash

# Debug mode
DEBUG="yes" # Make it empty to switch off debug mode

# System config
EXCLUDE_PATH="
/boot
/dev
/home
/lib/modules
/media
/mnt
/proc
/run
/sys
/usr/local
/usr/portage
/usr/src
/tmp
/var
"

# Variables
# TMP_DIR="/tmp/garbage"
TMP_DIR="."
TMP_PACKAGES="packages.txt"
TMP_PACKAGE_FILES="package_files.txt"
TMP_PACKAGE_FILES2="package_files2.txt"
TMP_SYSTEM_FILES="system_files.txt"
TMP_RESULT="garbage.txt"

# Implementation
[[ -n "$DEBUG" ]] && echo "Debug mode is ON"
[[ -z "$DEBUG" ]] && TMP_DIR=`mktemp` # Make unique directory

mkdir "${TMP_DIR}" 2> /dev/null # Be silent if the directory already exists

TMP_PACKAGES="$TMP_DIR/$TMP_PACKAGES"
TMP_PACKAGE_FILES="$TMP_DIR/$TMP_PACKAGE_FILES"
TMP_SYSTEM_FILES="$TMP_DIR/$TMP_SYSTEM_FILES"
TMP_RESULT="$TMP_DIR/$TMP_RESULT"

if [[ -f "$TMP_PACKAGES" ]] ; then 
	echo "Using existing package list..."
else
	echo "Looking for packages..."
	EIX_LIMIT=0 eix -#I > "$TMP_PACKAGES"
fi

if [[ -f "$TMP_PACKAGE_FILES" ]] ; then 
	echo "Using existing files list..."
else
	echo "Looking for files in packages..."
	rm "$TMP_PACKAGE_FILES" 2> /dev/null
	
	cat "$TMP_PACKAGES" | while read line; do
		echo "Processing '$line'..."
		equery f $line | grep "^/" >> "$TMP_PACKAGE_FILES2"
	done
	cat "$TMP_PACKAGE_FILES2" | grep -v "/usr/src" | sort | uniq > "$TMP_PACKAGE_FILES"
fi

echo "Listing files in the system..."

# Some optimization
FIND_CMD="find / -maxdepth 1 -type d ! -path /"
for E in $EXCLUDE_PATH ; do
	FIND_CMD="$FIND_CMD ! -path $E" 
done
FIND_CMD="$FIND_CMD -printf %p\40"
[[ -n "$DEBUG" ]] && echo "Find command 1: $FIND_CMD"

FIND_DIRS=`$FIND_CMD`
[[ -n "$DEBUG" ]] && echo -e "\n$FIND_DIRS\n"

# Main code
FIND_CMD="find $FIND_DIRS -type f "
for E in $EXCLUDE_PATH ; do
	FIND_CMD="$FIND_CMD ! -path \"$E/*\"" 
done
[[ -n "$DEBUG" ]] && echo "Find command 2: $FIND_CMD"
eval "$FIND_CMD" | sort | uniq > "$TMP_SYSTEM_FILES"

diff "$TMP_SYSTEM_FILES" "$TMP_PACKAGE_FILES" | grep "^<" | sed "s/^< //g" > "$TMP_RESULT"

[[ -z "$DEBUG" ]] && rm -rf "TMP_DIR"

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

Мусор в системе - понятие очень неоднозначное. ._cfg* - это мусор? Логи? Твои скрипты в /usr/local/bin? Файлы ядра в /boot?

На самом деле, самый неприятный «мусор» - лишние пакеты в /usr/portage/packages . Здесь я нашел рецепт как избавляться от лишнего, нужно будет как-то преобразовать это в скриптик. Еще скопление мусора в домашних каталогах - кеши, временные файлы и т. п. А общесистемный... Ладно давай попробуем...

Немного подмодифицировал твой скриптик...
- Все файлы и каталоги - в переменные. Так наглядней, да и помогает избежать некоторых проблем. Каталог делаем по-настоящему уникальным.
- Файлы в пакетах ищутся очень долго (equery f) . Так ты будешь делать отладку вечность. Вводим DEBUG режим - использование предыдущих наработок и, соответственно, не-удаление этих файлов в конце. Также, если DEBUG режим выключен - создавать уникальный каталог в /tmp . WARNING: Если честно, не тестировал с выключенным DEBUG режимом - лень. Оставлю тебе :)
- Поиск: лучше использовать принцип «Все, что не запрещено - то разрешено». Исключение для поиска - в отдельной переменной $EXCLUDE_PATH .
- Поиск: не понятно, что делать с симлинками, такими как /etc/bash_completion.d/eselect . Пока не добавлял.
- Не вижу ничего плохого в том, что от equery не парсятся каталоги (хотя я нашел рецепт как это сделать).
- Немного оптимизировал алгоритм поиска. Даже с ! -path оно ищет везде, это просто фильтр для вывода; пофиксил это.
- Немного очеловечил вывод diff.
- Пока скрипт создает временные файлы в текущем каталоге - см. переменную TMP_DIR .

Если честно, результаты неоднозначные. Например, многие файлы в /etc/ не принадлежат ни к одному пакету. /usr/lib/perl5/5.18.2/i686-linux/bits/* не принадлежат ни к кому; мне как-то не очень хочется их удалять, скорее всего они просто сгенерированы динамически каким-то perl-cleaner'ом. Аналогично с python'ом. Mime-типы. В исключения их? Очевидного мусора не так уж и много. Все-же в unix хорошо продуманная fhs, мусора практически не появляется. Ну, или это Gentoo такая продуманная, что тоже может быть ;)

Поразмял мозг в воскресенье :) . ИМХО, скрипт полезен скорее с точки зрения изучения строения системы.

Вот:

#!/bin/bash

# Debug mode
DEBUG="yes" # Make it empty to switch off debug mode

# System config
EXCLUDE_PATH="
/boot
/dev
/home
/lib/modules
/media
/mnt
/proc
/run
/sys
/usr/local
/usr/portage
/usr/src
/tmp
/var
"

# Variables
# TMP_DIR="/tmp/garbage"
TMP_DIR="."
TMP_PACKAGES="packages.txt"
TMP_PACKAGE_FILES="package_files.txt"
TMP_PACKAGE_FILES2="package_files2.txt"
TMP_SYSTEM_FILES="system_files.txt"
TMP_RESULT="garbage.txt"

# Implementation
[[ -n "$DEBUG" ]] && echo "Debug mode is ON"
[[ -z "$DEBUG" ]] && TMP_DIR=`mktemp` # Make unique directory

mkdir "${TMP_DIR}" 2> /dev/null # Be silent if the directory already exists

TMP_PACKAGES="$TMP_DIR/$TMP_PACKAGES"
TMP_PACKAGE_FILES="$TMP_DIR/$TMP_PACKAGE_FILES"
TMP_SYSTEM_FILES="$TMP_DIR/$TMP_SYSTEM_FILES"
TMP_RESULT="$TMP_DIR/$TMP_RESULT"

if [[ -f "$TMP_PACKAGES" ]] ; then 
	echo "Using existing package list..."
else
	echo "Looking for packages..."
	EIX_LIMIT=0 eix -#I > "$TMP_PACKAGES"
fi

if [[ -f "$TMP_PACKAGE_FILES" ]] ; then 
	echo "Using existing files list..."
else
	echo "Looking for files in packages..."
	rm "$TMP_PACKAGE_FILES" 2> /dev/null
	
	cat "$TMP_PACKAGES" | while read line; do
		echo "Processing '$line'..."
		equery f $line | grep "^/" >> "$TMP_PACKAGE_FILES2"
	done
	cat "$TMP_PACKAGE_FILES2" | grep -v "/usr/src" | sort | uniq > "$TMP_PACKAGE_FILES"
fi

echo "Listing files in the system..."

# Some optimization
FIND_CMD="find / -maxdepth 1 -type d ! -path /"
for E in $EXCLUDE_PATH ; do
	FIND_CMD="$FIND_CMD ! -path $E" 
done
FIND_CMD="$FIND_CMD -printf %p\40"
[[ -n "$DEBUG" ]] && echo "Find command 1: $FIND_CMD"

FIND_DIRS=`$FIND_CMD`
[[ -n "$DEBUG" ]] && echo -e "\n$FIND_DIRS\n"

# Main code
FIND_CMD="find $FIND_DIRS -type f "
for E in $EXCLUDE_PATH ; do
	FIND_CMD="$FIND_CMD ! -path \"$E/*\"" 
done
[[ -n "$DEBUG" ]] && echo "Find command 2: $FIND_CMD"
eval "$FIND_CMD" | sort | uniq > "$TMP_SYSTEM_FILES"

diff "$TMP_SYSTEM_FILES" "$TMP_PACKAGE_FILES" | grep "^<" | sed "s/^< //g" > "$TMP_RESULT"

[[ -z "$DEBUG" ]] && rm -rf "TMP_DIR"