Корзина в Bash Script

Я пытаюсь создать базовую концепцию корзины в виртуальной машине с помощью сценариев bash. Потребуется удалить введенные файлы и поместить их в созданный каталог, а затем сохранить путь (источник) в файл журнала для последующего использования в функции восстановления.

Я начну со своего кода удаления / повторного использования, который, как я считаю, работает нормально, но кажется неаккуратным / содержит избыточный код:

#!/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 `'

Есть мысли о том, где я ошибаюсь?


person Community    schedule 29.11.2016    source источник
comment
Вы приводите только mv один аргумент. Возможно, вы думали mv -i "$1" "$(grep "$1" "$HOME/recycle/recycle_log")" переместить файл в соответствующую запись журнала.   -  person that other guy    schedule 29.11.2016
comment
@thatotherguy другой парень, который изменяет ошибку на mv: cannot move 'example.txt' to ': No such file or directory   -  person    schedule 29.11.2016
comment
Я не заметил, что вы пишете свой журнал в $HOME/recycle/recycle_log/log_file, но просите grep читать из $HOME/recycle/recycle_log. Вы можете использовать mv -i "$1" "$(grep "$1" "$HOME/recycle/recycle_log/log_file")", чтобы исправить это   -  person that other guy    schedule 29.11.2016
comment
@thatotherguy Я подозревал, что был немного слеп, но не думал, что я настолько плох. С другой стороны, поскольку теперь это работает, как мне реализовать это, чтобы сам файл журнала очищался от этой конкретной строки при ее восстановлении?   -  person    schedule 29.11.2016
comment
Вот вопрос по этому поводу.   -  person that other guy    schedule 29.11.2016
comment
@thatotherguy Хороший, я прочитаю это, я так понимаю, что будет не так уж сложно прикрепить '.bak' к концу файла, если он уже находится в месте назначения?   -  person    schedule 29.11.2016
comment
Проверить mv --backup=numbered   -  person that other guy    schedule 29.11.2016


Ответы (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: Прерывание при любой ошибке, чтобы избежать некоторых ошибок

$@: массив аргументов ($ 1, $ 2 ...)

[ ! -d $1 ] || return 0: Поскольку мы используем set -e, не ошибитесь, если каталог существует

grep "\/${name}\$" ...: соответствует только имени в конце пути

sed -i: редактирование sed на месте для удаления строки

person Vinicius    schedule 29.11.2016