所以基本上我试图在bash shell中创建一个脚本,它将模拟windows删除功能。
因此,它不会删除文件或文件夹,而是将其移动到回收站。我将所有工作都与我将文件夹移动到回收站中的问题分开了。
例如,如果我有一个空文件夹并运行我的脚本safe_rm,它将不会将文件夹移动到bin。但是,如果我在该父文件夹中有一个子文件夹,它将删除父文件夹和子文件夹,所以
safe_rm -r dir1 /< - 不会删除
但
safe_rm dir1 /,内容为dir2 file1(dir1 / file1 dir1 / dir2)将删除。
这是我的代码我遇到了
的问题moveFilesFolder(){
#check if file/directory exists
if [ $(checkFileFolder $1) == "true" ]
then
movingFilesToRemove=$(ls $1)
#if there's too many files/directories then send them to the moveFiles functions
if [ ${#movingFilesToRemove[*]} -gt 1 ]
then
movingFiles $movingFilesToRemove
else
#folder handling
if [ $(isFolder $1) == "true" ]
then
#we check the rR flag for selected folder
if [ $optionRFlag == "false" ]
then
echo "rm: cannot remove \`$1': Is a directory"
else
lvlDown=true
#we check if the I argument used on the folder,
#which prompts the user
if [ $optionIFlag == "true" ] && [ $(isFolderEmpty $1) == "false" ]
then
read -p "rm: descend into directory \`$1'?" downFolder
case $downFolder in
y* | Y*)
lvlDown="true" ;;
*)
lvlDown="false" ;;
esac
fi
if [ $lvlDown == "true" ]
then
#now we display all the descending folders and gives full path
#i will be using the sed command to handle sub files
#this will proceed every item with present working folde
subfiles=$(ls $1 | sed "s;^;`pwd`/$1;")
# subfiles=$(ls $1 | grep '^d' )
# subfiles=$(ls -R | grep ":" | sed "s/://" )
movingFiles $subfiles
#now we move the empty folder
if [ $(isFolderEmpty $1) == "false" ]
then
dlt=true
if [ $optionIFlag == "true" ]
then
read -p "rm: remove directory \`$1'?" deleteFolder
case $deleteFolder in
y* | Y*)
dlt="true" ;;
*)
dlt="false" ;;
esac
fi
if [ $dlt == "true" ]
then
mv $1 $recycleFolder
echo `pwd`
if [ $optionVFlag == "true" ]
then
echo "removed directory: \`$1'"
fi
fi
fi
fi
fi
else
#here we are dealing with file handling
agreed=true
if [ $optionIFlag == "true" ]
then
read -p "$(interMessage $1)" userAccepts
case $userAccepts in
y* | Y*)
agreed="true" ;;
*)
agreed="false" ;;
esac
fi
#refer to above i flag
if [ $agreed == "true" ]
then
mv $1 $recycleFolder
echo `pwd`
if [ $optionVFlag == "true" ]
then
echo "removed \`$1'"
fi
fi
fi
fi
else
echo "rm: cannot remove \`$1': No such file or directory"
fi
}
答案 0 :(得分:4)
请参阅comp.unix.questions faq,问题3.6:“我如何”取消删除“文件?”
http://www.faqs.org/faqs/unix-faq/faq/part3/
两点:首先,这是普遍接受的 作为坏的想法。您将依赖于此行为 “rm”,你会发现自己有一天会在一个正常的系统上 “rm”真的是“rm”,你会遇到麻烦。 其次,你最终会发现处理的麻烦 它维护垃圾桶所涉及的磁盘空间和时间 对于“rm”来说可能更容易一点。对于 首先,你应该在你的“rm”中查找“-i”选项 手册。
答案中提到的MIT删除/取消删除实用程序套件可以在
找到http://ftp.funet.fi/pub/archive/comp.sources.misc/volume17/delete/
答案 1 :(得分:1)
大多数Linux系统上的垃圾都在~/.local/share/Trash/{expunged,files,info}
。跟踪元信息涉及一些子目录,但如果您不担心完全符合trashspec,则可以将文件或目录投入~/.local/share/Trash/files
。
即使您不关心垃圾邮件的完全符合性,您仍然可以使用垃圾设施,同时确保符合其关键要求之一。 trashspec说:
即使具有相同名称和位置的文件多次被删除,每次后续删除都不得覆盖以前的副本。
您可以使用基本的shell函数来满足要求。例如:
trash () {
local trashdir="$HOME/.local/share/Trash/files"
mkdir -p "$trashdir"
mv --backup=numbered "$@" "${trashdir}/"
}
如果您使用的是基于Debian的系统,则可以安装trash-cli。安装后,您可以直接调用它或将其别名以供透明使用。例如:
sudo aptitude install trash-cli
alias rm='trash'
mkdir /tmp/foobarbaz
touch /tmp/foobarbaz
rm -rf /tmp/foobarbaz
请注意,这似乎并不能很好地处理Ubuntu的ecryptfs安装的主目录,但除此之外,无需重新发明轮子就可以开箱即用。“