Bash 脚本中的回收站

Recycle Bin in Bash Script

我正在尝试使用 bash 脚本在虚拟机中创建一个基本的回收站概念。它将需要删除已输入的文件并将它们放入创建的目录中,并将路径(来源)保存到日志文件中,以便稍后在恢复功能中使用。

我将从我的 delete/recycle 代码开始,我认为它工作得很好,但似乎有点 untidy/contains 冗余代码:

#!/bin/sh  

if [ ! -d ~/recycle ]
then mkdir ~/recycle
fi

if [ ! -d ~/recycle/recycle_log ]
then mkdir ~/recycle/recycle_log
fi

if [ ! -d ~/recycle/recycle_bin ]
then mkdir ~/recycle/recycle_bin
fi

if [ -d ~/recycle ]
then
echo "$(readlink -f "")" >> "$HOME/recycle/recycle_log/log_file" && mv "" "$HOME/recycle/recycle_bin"
echo "$(readlink -f "")" >> "$HOME/recycle/recycle_log/log_file" && mv "" "$HOME/recycle/recycle_bin"
echo "$(readlink -f "")" >> "$HOME/recycle/recycle_log/log_file" && mv "" "$HOME/recycle/recycle_bin"
echo "$(readlink -f "")" >> "$HOME/recycle/recycle_log/log_file" && mv "" "$HOME/recycle/recycle_bin"
fi

#end

此后我的还原脚本如下:

#!/bin/sh

cd "$HOME/recycle/recycle_bin" || exit 1
mv -i "$(grep "" "$HOME/recycle/recycle_log")"

我想这有点接近我需要 return 将存储在 log/recycle bin 中的任何已删除文件恢复到其原始位置,但我得到的错误是:

mv: missing destination file operand after `'

有没有想过我哪里出错了?

试试这个:

recycle.sh

#!/bin/sh  

set -e

check_dir() {
    [ ! -d  ] || return 0
    mkdir --parents 
}

check_dir "${HOME}/recycle/recycle_bin"
touch "${HOME}/recycle/recycle_log"

for file in "$@"; do
    echo "$(readlink -f "$file")" >> "${HOME}/recycle/recycle_log"
    mv "$file" "${HOME}/recycle/recycle_bin"
done

#end

restore.sh

#!/bin/sh

set -e

cd "${HOME}/recycle/recycle_bin" || exit 1

for name in "$@"; do
    file=$(grep "\/${name}$" "${HOME}/recycle/recycle_log")
    mv -i $name "$file"
    sed -i "/\/${name}$/ d" "${HOME}/recycle/recycle_log"
done

一些见解:

set -e:遇到任何错误都会中止,以避免一些 if

$@: 参数数组 ($1, $2...)

[ ! -d ] || return 0: 由于我们使用的是set -e,如果目录存在

,不要失败

grep "\/${name}$" ...: 只匹配路径末尾的名字

sed -i: sed 就地编辑删除行