【问题标题】:Recycle Bin in Bash ScriptBash 脚本中的回收站
【发布时间】:2016-11-30 05:57:59
【问题描述】:

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

我将从我的删除/回收代码开始,我认为它工作得很好,但似乎有点不整洁/包含冗余代码:

#!/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 "$1")" >> "$HOME/recycle/recycle_log/log_file" && mv "$1" "$HOME/recycle/recycle_bin"
echo "$(readlink -f "$2")" >> "$HOME/recycle/recycle_log/log_file" && mv "$2" "$HOME/recycle/recycle_bin"
echo "$(readlink -f "$3")" >> "$HOME/recycle/recycle_log/log_file" && mv "$3" "$HOME/recycle/recycle_bin"
echo "$(readlink -f "$4")" >> "$HOME/recycle/recycle_log/log_file" && mv "$4" "$HOME/recycle/recycle_bin"
fi

#end

此后我的恢复脚本如下:

#!/bin/sh

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

我想这有点接近我需要返回存储在日志/回收站中的任何已删除文件以恢复其原始位置但我得到的错误是:

mv: missing destination file operand after `'

对我哪里出错有什么想法吗?

【问题讨论】:

  • 你只给mv一个参数。也许您的想法是 mv -i "$1" "$(grep "$1" "$HOME/recycle/recycle_log")" 将文件移动到其日志条目。
  • @thatotherguy other guy 这将错误更改为mv: cannot move 'example.txt' to ': No such file or directory
  • 我没有注意到您将日志写入$HOME/recycle/recycle_log/log_file,但请您的 grep 从$HOME/recycle/recycle_log 读取。你可以使用mv -i "$1" "$(grep "$1" "$HOME/recycle/recycle_log/log_file")" 来解决这个问题
  • @thatotherguy 我怀疑我有点失明,但并不认为我那么糟糕。另一方面,由于这现在可​​以工作,我将如何实现它,以便在恢复日志文件时清除该特定行?
  • Here's a question 关于那个。

标签: linux sh recycle-bin


【解决方案1】:

试试这个:

recycle.sh

#!/bin/sh  

set -e

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

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 $1 ] || return 0:由于我们使用的是set -e,所以如果目录存在就不要失败

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

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

【讨论】:

    猜你喜欢
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-02
    • 2012-08-02
    • 2010-10-06
    • 1970-01-01
    • 2022-10-13
    相关资源
    最近更新 更多