我需要使用路径名将文件恢复到原始位置,该路径名可以在我创建的.restore.info文件中找到。
以下是删除脚本:
# did the user enter a filename
if [ -z "$1" ]; then
echo "No file was entered"
exit
fi
# warns the user if a directory and not a file was entered
if [ -d "$1" ]; then
echo "Directory name entered. Please enter file name"
exit
fi
# if the correct file name is entered then display file deleted
if [ ! -f "$1" ]; then
echo "$1 Does not exist"
exit
fi
# finds inode of a file to avoid files with the same name
inode=$(stat -c '%i' $1) 2>/dev/null
# shows the path of the file
path=$(readlink -f "$1") 2>/dev/null
# prints name of the file and its path in the .restore.info file
echo "$1_$inode:$path" >> ~/.restore.info 2>/dev/null
# warns the user if they enter this script as an argument
if [ $1 = "remove123" ]; then
read -p "Are you sure you want to delete remove? y/n: " answer
#if yes, then remove the file otherwise do nothing
if [[ $answer = y ]] ; then
mv "$1" deleted/"$1"_"$inode" 2>/dev/null
echo "$1_$inode:$fixedPath" >> ~/.restore.info 2>/dev/null
else
exit
fi
fi
#moves to deleted dir
mv "$1" deleted/"$1_$inode" | cut -d " " -f 1 2>/dev/null
以下是我在恢复脚本中的内容:
#!/bin/bash
#go to deleted directory
cd ~/deleted
# did the user enter the argument
if [ -z "$1" ]; then
echo "No file was entered"
exit
fi
# if the incorrect file name is entered then display file deleted
if [ ! -f "$1" ]; then
echo "$1 Does not exist"
exit
fi
#move restored file to the original path
original=$(grep "$1" .restore.info | cut -d ":" -f2 )
mv $1 $original
更新:我设法弄清楚如何从.restore.info中的文件中获取原始路径名。我使用了grep和cut命令,它们在命令行上运行,但不在我的脚本中。我收到错误:grep: .restore.info: No such file or directory
。有什么想法吗?
答案 0 :(得分:0)
如果我正确地阅读了您的第一个脚本,您正在做的是将完整的文件规范(路径和文件名)写入.restore.info
文件,前面加上文件名和inode文件。然后,您将文件移动到"已删除"目录。
取消删除"根据{{1}}文件中的filespec,您要将文件移回目录所在的目录。
在这种情况下,您不需要执行.restore.info
文件的readlink;你想简单地从中得到正确的文件路径。所以,这样的事情会起到作用:
.restore.info
第一行使用恢复文件中的完整行加载restinfo=`grep "$1" ~/.restore.info`
echo $restinfo
filespec=${restinfo##*:}
echo $filespec
path=${filespec%/*}
echo $path
delname=${restinfo%:*}
echo $delname
变量。然后我们抓住冒号后面的所有内容(restinfo
)并将其放在filespec中。这将是原始路径加上文件名。下一位抓住了它的路径部分,但是当你"删除"时,你重新命名了文件。它,我们需要使用完整的文件规范。所以我们并不真正需要"路径",但是到底是什么。最后,我们获取已删除文件的名称(文件名加上inode)。现在我们已经拥有了所有我们需要的东西#14;取消删除"文件:
:
我做了一些测试来检查这是否有效。首先,我创建了一个脚本来构建删除文件,然后另一个脚本来解析恢复它所需的信息。以下是两个脚本:
mv deleted/$delname $filespec
请注意,我更改了测试的还原文件的名称。这是输出:
tmp1()
{
# finds inode of a file to avoid files with the same name
inode=$(stat -c '%i' $1) 2>/dev/null
# shows the path of the file
path=$(readlink -f "$1") 2>/dev/null
# prints name of the file and its path in the .restore.info file
echo "$1_$inode:$path" >> test-restore.info 2>/dev/null
}
tmp2()
{
restinfo=`grep "$1" test-restore.info`
echo $restinfo
filespec=${restinfo##*:}
echo $filespec
path=${filespec%/*}
echo $path
delname=${restinfo%:*}
echo $delname
}
首先,我删除了恢复文件,以确保它是空的。然后我"删除"两个文件(刚刚加载了恢复文件),在文件上做了> rm test-restore.info
> tmp1 testin.txt
> tmp1 testout.txt
> cat test-restore.info
testin.txt_30412509:/home/sinasnet/test1/testin.txt
testout.txt_30412507:/home/sinasnet/test1/testout.txt
> tmp2 testin.txt
testin.txt_30412509:/home/sinasnet/test1/testin.txt
/home/sinasnet/test1/testin.txt
/home/sinasnet/test1
testin.txt_30412509
> tmp2 testout.txt
testout.txt_30412507:/home/sinasnet/test1/testout.txt
/home/sinasnet/test1/testout.txt
/home/sinasnet/test1
testout.txt_30412507
>
,然后做了第二个脚本以获取所需的信息"取消删除"文件。
你的删除脚本有几个问题,顺便说一句。首先,您将已删除的文件移至"已删除的"用户所在目录下的目录。可能没有这样的目录,如果存在,则假定用户在取消删除文件时将位于同一目录中。这有很多假设。使用特定的"删除"可能更好。目录,例如〜/删除。
接下来,我不确定你移动cat
命令的目的是什么,但我不认为它会做很多事情。
最后,您加载cut
变量,但不要使用它。评论说你正在展示这条路,但实际上它只是加载它。
无论如何,我希望这有帮助。