我已经制作了这个脚本,但是我很难为这种情况编写代码: 在垃圾桶里应该没有同名的文件;在这种情况下,他们应该重命名。
我该如何解决?
这是我的代码:
#!/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
答案 0 :(得分: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")"
答案 1 :(得分: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"
答案 2 :(得分:0)
实际上,我在2010年写过。现在有一个针对Ubuntu的trash-cli包。
http://wiki.linuxquestions.org/wiki/Scripting#Command_Line_Trash_Can