2013-08-27 23 views
0

我已经制作了这个脚本,但是我很难为这种情况编写代码: 在垃圾桶中应该没有相同名称的文件;在这种情况下,他们应该重新命名。脚本bash外壳 - 制作替代垃圾桶

我该如何解决?

这里是我的代码:

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

其中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"