2013-08-27 6 views
0

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

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

Вот мой код:

#!/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 
+2

Вы все еще должны получить абсолютную форму имени пути файла, если относительный путь был принят, т.е. преобразования .. и. потому что они не могут быть созданы как каталоги. Попробуйте использовать 'realpath' или' readlink -m'. Вы также можете использовать другие решения абсолютного пути: http://www.linuxquestions.org/questions/blog/konsolebox-210384/getting-absolute-paths-of-unix-directories-and-filenames-in-shell-scripts-3956 /. Даже с путями, начинающимися с /, вы не можете быть уверены, что они находятся в абсолютной форме и могут содержать '.' Или '..'. – konsolebox

+0

Вы можете быть заинтересованы в https://github.com/robrwo/bashtrash – Rob

ответ

0

Быстрый и грязный раствор:

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")"
    И так далее ...
0

Рассмотрим генерируя сумму косую как 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"