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 就地编辑删除行
我正在尝试使用 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 就地编辑删除行