如何将文件还原到保存在另一个文件中的原始路径?

时间:2017-04-08 20:16:09

标签: bash shell

我需要使用路径名将文件恢复到原始位置,该路径名可以在我创建的.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。有什么想法吗?

1 个答案:

答案 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变量,但不要使用它。评论说你正在展示这条路,但实际上它只是加载它。

无论如何,我希望这有帮助。