Скрипт bash shell - Создание альтернативной корзины

Я сделал этот скрипт, но у меня есть трудности с написанием кода для этой ситуации: в корзине не должно быть файла с тем же именем; в этом случае они должны быть переименованы.

Как я могу решить?

Вот мой код:

#!/bin/bash

help() {
    echo "Options:"
    echo "\"safe-rm pathname\" to delete, where the pathname can be absolute or relative"
echo "\"safe-rm --recover original pathname\" (including the /) to recover and restore a file or a directory in the original position"
    echo "\"safe-rm --list\" to lists the trashcan's content"
    echo "\"safe-rm --search\" to search a file in the trashcan"
    echo "\"safe-rm --delete-older-than\" to delete files older than certain days"
}

delete() {
    if [ ${PARAM1:0:1} = "/" ]; then
        echo "You have insert an absolute pathname"
        mkdir -p $(dirname $TRASH$PARAM1)
        mv $PARAM1 $TRASH$PARAM1
    else
        echo "You have insert a relative pathname"
        mkdir -p $(dirname $TRASH$(pwd)/$PARAM1)
        mv $PARAM1 $TRASH$(pwd)/$PARAM1
    fi
}

readonly TRASH=$HOME/.Trash;
readonly PARAM1=$1;
readonly PARAM2=$2;

mkdir -p $TRASH;

case "$PARAM1" in
    "")
        help    
    ;;
    --list)
        echo "Trashcan's content"
        cd $TRASH
        find *
    ;;
    --delete-older-than)
        echo "Delete the files older than $PARAM2 days"
        find $TRASH -mtime +$PARAM2 | xargs rm -rf
    ;;
    --search)
        echo "Search $PARAM2 among the trashcan's files"
        cd $TRASH
        find -name *$PARAM2*
    ;;
    --recover)
        echo "Recover the file/directory in the original position"
        mkdir -p $(dirname $PARAM2)
        mv $TRASH$PARAM2 $PARAM2
    ;;
    *) 
        echo "Security delete a file/directory"
        delete
    ;;
esac

exit 0

3 ответа

На самом деле, я писал об этом еще в 2010 году. Теперь есть пакет trash-cli для Ubuntu.

http://wiki.linuxquestions.org/wiki/Scripting

Подумайте о том, чтобы сгенерировать конечную сумму, такую ​​как sha1sum, в ваших файлах, когда они хранятся в корзине, чтобы избежать конфликтов с похожими файлами. например

$HOME/.Trash/home/user/same/path/same_name.9ce1f394b955306f7c450cbf0d96d2f17f6a1394
$HOME/.Trash/home/user/same/path/same_name.b0dc31b1919c02932892b59d0c0e365cd75629c6

При восстановлении этих файлов вы просто удалили сумму как

/home/user/same/path/same_name

Решение может также предотвратить дублирование действительно одних и тех же файлов из-за возможной уникальности того, что могут делать суммы.

Если вы доверяете суммам достаточно, вы также можете не хранить каталоги в корзине. Просто их подписи с дополнительным информационным файлом, например:

$HOME/.Trash/same_name.9ce1f394b955306f7c450cbf0d96d2f17f6a1394
$HOME/.Trash/same_name.9ce1f394b955306f7c450cbf0d96d2f17f6a1394.info

Где информация содержит абсолютный путь к каталогу, в котором находится файл.

/home/user/same/path/

Вы можете даже добавить другие атрибуты, такие как права доступа к каталогу и т. Д.

[File]
/home/user/same/path/same_name

[Attributes]
/home[ TAB ]USER:GROUP[ TAB ]0755
/home/user[ TAB ]USER:GROUP[ TAB ]0755
/home/user/same[ TAB ]USER:GROUP[ TAB ]0755
/home/user/same/path[ TAB ]USER:GROUP[ TAB ]0755
/home/user/same/path/same_name[ TAB ]USER:GROUP[ TAB ]0644

По сути, суммы - это просто понятия, но вы можете добавить к ним больше трюков, чтобы сделать существование файлов в корзине чуть более уникальным, только если учесть, что они больше не могут помешать файлам, которые действительно одинаковы существовать как две записи, которые могли бы не быть необходимыми.

Также, конечно, в вашем скрипте, если вы хотите поддерживать имена файлов с пробелами и отметками "Нравится", всегда помещайте свои переменные в двойные кавычки, чтобы они не разделялись на слова, что означает, что они могут быть позже интерпретированы как два или более аргумента команды, вызывающей синтаксическую ошибку. к команде или неожиданным результатам, в которых некоторые могут быть безотзывными.

do something "$var" "${etc}xyz"

Быстрое и грязное решение:

if [[ -f $TRASH$PARAM ]]; then
    mv "$PARAM1" "$TRASH$PARAM$RANDOM$RANDOM" # file exists
else
    mv "$PARAM1" "$TRASH$PARAM" # ok, it is fine, file does not exist
fi

Также обратите внимание, что вы должны заключать в кавычки каждую переменную в вашем скрипте, когда она передается в качестве параметра.

  • if [ ${PARAM1:0:1} = "/" ]; then должен быть изменен на, если [ "${PARAM1:0:1}" = "/" ]; then или даже лучше if [[ ${PARAM1:0:1} = "/" ]]; then
  • mkdir -p $(dirname $TRASH$PARAM1) в mkdir -p "$(dirname "$TRASH$PARAM1")"
    И так далее...
Другие вопросы по тегам