1 (03.09.2010 15:19:49 отредактировано Termo)

вот исходный код

#!/bin/bash
# defrag v0.08 by Con Kolivas <kernel@kolivas.org
# Braindead fs-agnostic defrag to rewrite files in order largest to smallest
# Run this in the directory you want all the files and subdirectories to be
# reordered. It will only affect one partition. It works best when run twice.
# Are you really crazy enough to be using this? It might blow your data
# into tiny little useless chunks.


trap 'abort' 1 2 15

renice 19 $$ > /dev/null

abort()
{
    echo -e "\nAborting"
    rm -f tmpfile dirlist
    exit 1
}

fail()
{
    echo -e "\nFailed"
    abort
}

declare -i filesize=0
declare -i numfiles=0

#The maximum size of a file we can easily cache in ram
declare -i maxsize=$((`awk '/MemTotal/ {print $2}' /proc/meminfo`*1024))
(( maxsize-= `awk '/Mapped/ {print $2}' /proc/meminfo` ))
(( maxsize/= 2))

if [[ -a tmpfile || -a dirlist  ]] ; then
    echo dirlist or tmpfile exists
    exit 1
fi

# Sort in the following order:
# 1) Depth of directory
# 2) Size of directory descending
# 3) Filesize descending
# I made this crap up. It's completely unvalidated.

echo "Creating list of files..."

#stupid script to find max directory depth
find -xdev -type d -printf "%d\n" | sort -n | uniq > dirlist

#sort directories in descending size order
cat dirlist | while read d;
do
    find -xdev -type d -mindepth $d -maxdepth $d -printf "\"%p\"\n" | \
        xargs du -bS --max-depth=0 | \
        sort -k 1,1nr -k 2 |\
        cut -f2 >> tmpfile
    if (( $? )) ; then
        fail
    fi

done

rm -f dirlist

#sort files in descending size order
cat tmpfile | while read d;
do
    find "$d" -xdev -type f -maxdepth 1 -printf "%s\t%p\n" | \
        sort -k 1,1nr | \
        cut -f2 >> dirlist
    if (( $? )) ; then
        fail
    fi
done

rm -f tmpfile

numfiles=`wc -l dirlist | awk '{print $1}'`

echo -e "$numfiles files will be reordered\n"

#copy to temp file, check the file hasn't changed and then overwrite original
cat dirlist | while read i;
do
    (( --numfiles ))
    if [[ ! -f $i ]]; then
        continue
    fi

    #We could be this paranoid but it would slow it down 1000 times
    #if [[ `lsof -f -- "$i"` ]]; then
    #    echo -e "\n File $i open! Skipping"
    #    continue
    #fi

    filesize=`find "$i" -printf "%s"`
    # read the file first to cache it in ram if possible
    if (( filesize < maxsize ))
    then
        echo -e "\r $numfiles files left                                                            \c"
        cat "$i" > /dev/null
    else
        echo -e "\r $numfiles files left - Reordering large file sized $filesize ...                \c"
    fi

    datestamp=`find "$i" -printf "%s"`
    cp -a -f "$i" tmpfile
    if (( $? )) ; then
        fail
    fi
    # check the file hasn't been altered since we copied it
    if [[ `find "$i" -printf "%s"` != $datestamp ]] ; then
        continue
    fi

    mv -f tmpfile "$i"
    if (( $? )) ; then
        fail
    fi
done

echo -e "\nSucceeded"

rm -f dirlist

как из него сделать исполняемый скрипт?

1. сохранить как script.sh
2. сделать исполняемым chmod a+x script.sh
3. войти в директорию и запустить? cd ../.. script.sh
или sudo sh script.sh?

или я что-то упустил?
*просто я уже давненько ничего не запускал* ab

ПатреГ не любит Gnome...

2

./name

3

краткость - сестра таланта?
понимаю...

ПатреГ не любит Gnome...

4

Termo пишет:

1. сохранить как script.sh
2. сделать исполняемым chmod a+x script.sh
3. войти в директорию и запустить? cd ../.. script.sh
или sudo sh script.sh?

да.

При укусе ядовитой змеи, держите её голову на расстоянии от себя, чтобы она не укусила вас в ответ...

5

замечания по скрипту
1. лучше запускать от root
2. работает по скорости средне, a la defraggler.exe
3. большие файлы обрабатывает медленно и печально, дефрагментирует слабо
как пример, раздел /home - было 22,12%, стало 17,71%
раздел /usr было 2,23%, стало 0,81%

в общем, раз в год можно сделать.

ПатреГ не любит Gnome...

6

Termo пишет:

или sudo sh script.sh?

если вы хотите приключений на свою ... то именно так.
но лучше НЕ надо
таким образом запускается вредоносное ПО, только-что скаченное из сети.

Writer пишет:

2. сделать исполняемым chmod a+x script.sh

желательно chmod 744 script.sh
и ещё - если вы не понимаете точно, как это работает - лучше сделать отдельного юзера, там сделать скрипт, и там-же его запускать. Во всяком случае, этот скрипт не сможет прибить ваши нужные данные. (в большинстве дистрибутивов).

sudo в убунте == права суперпользователя == убитая система и ваши данные.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

7

drBatty пишет:

если кто-то бьётся головой об стену, это не говорит о безопасности этого занятия. К тому-же, этот кто-то в каске

Termo пишет:

почему я не могу запустить от рута программу если я этого желаю?
просто я не совсем понял о чем речь пошла...

Обсуждение продолжено в другой теме  smile
Эти два последних сообщения вынужден удалить...

"Теория и практика иногда сталкиваются. Когда это случается, теория проигрывает. Всегда." (с) Линус Торвальдс