Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
脚本bash shell-制作另一个垃圾桶_Bash_Shell_Recycle Bin - Fatal编程技术网

脚本bash shell-制作另一个垃圾桶

脚本bash shell-制作另一个垃圾桶,bash,shell,recycle-bin,Bash,Shell,Recycle Bin,我已经编写了这个脚本,但是我很难为这种情况编写代码: 垃圾桶中不应有同名文件;在这种情况下,应重命名它们 我怎样才能解决这个问题 这是我的密码: #!/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\"

我已经编写了这个脚本,但是我很难为这种情况编写代码: 垃圾桶中不应有同名文件;在这种情况下,应重命名它们

我怎样才能解决这个问题

这是我的密码:

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

快速而肮脏的解决方案:

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}=“/”;然后必须将
    更改为if
    [“${PARAM1:0:1}”=“/”;然后
    或者如果[${PARAM1:0:1}=“/”],则更好地
    ;然后
  • mkdir-p$(dirname$TRASH$PARAM1)
    to
    mkdir-p“$(dirname“$TRASH$PARAM1”)”

    等等

当文件存储在垃圾桶上时,考虑在文件上生成类似sha1sum的尾随和,以防止与类似文件发生冲突。e、 g

$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"

事实上,我早在2010年就写过了。现在Ubuntu有了一个垃圾cli包


如果传递了相对路径名,即convert,则仍然必须获取文件路径名的绝对形式。。和。条目正确,因为这些条目不能创建为目录。尝试使用
realpath
readlink-m
。您还可以使用其他绝对路径解决方案:。即使是以/开头的路径,也不能确定它们是绝对形式的,并且可以包含
。您可能会感兴趣