2016-11-29 2 views
0

Ich versuche, ein grundlegendes Papierkorb-Konzept in einer VM mithilfe von Bash-Skripts zu erstellen. Es muss die eingegebenen Dateien löschen und in ein erstelltes Verzeichnis stellen und den Pfad (Ursprung) in eine Protokolldatei speichern, um später in einer Wiederherstellungsfunktion verwendet zu werden.Papierkorb in Bash-Skript

werde ich mit meinem Lösch-/recycle Code beginnen, die ich funktioniert gut glauben, aber irgendwie unsauber scheint/enthält redundante Code:

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

Danach, was ich habe für meine wiederherstellen Skript ist wie folgt:

#!/bin/sh 

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

ich stelle mir das etwas in der Nähe zu dem, was ich brauche jede gelöschte Datei im Protokoll/Papierkorb gespeichert zurückkehren zu ihrem Ursprung wieder hergestellt werden, aber der Fehler ich erhalte ist:

mv: missing destination file operand after `' 

Irgendwelche Gedanken darüber, wo ich falsch liege?

+0

Sie nur geben 'mv' ein Argument zu entfernen. Vielleicht war Ihr Denken 'mv -i" $ 1 "" $ (grep "$ 1" "$ HOME/recycle/recycle_log") "', um die Datei in ihren Protokolleintrag zu verschieben. –

+0

@thatotherguy anderer Typ Das ändert den Fehler in 'mv: kann 'example.txt' nicht in ': Keine solche Datei oder Verzeichnis verschieben' –

+0

Ich habe nicht bemerkt, dass Sie Ihr Protokoll in' $ HOME/recycle/recycle_log/log_file schreiben 'aber bitte deinen grep, aus' $ HOME/recycle/recycle_log' zu lesen. Sie können 'mv -i" $ 1 "" $ (grep "$ 1" "$ HOME/recycle/recycle_log/log_file") "' verwenden, um das zu beheben –

Antwort

0

Try this:

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 "[email protected]"; 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 "[email protected]"; do 
    file=$(grep "\/${name}\$" "${HOME}/recycle/recycle_log") 
    mv -i $name "$file" 
    sed -i "/\/${name}\$/ d" "${HOME}/recycle/recycle_log" 
done 

Einige Einblicke:

set -e: bei jedem Fehler abbrechen, einige zu vermeiden, wenn

ist

[email protected]: Das Array von Argumenten (1, $ 2 $ ...)

[ ! -d $1 ] || return 0: Da wir set -e verwenden, nicht fehlschlagen, wenn das Verzeichnis

grep "\/${name}\$" ... existiert: Spiele nur den Namen am Ende des Weges

sed -i: in-place sed Bearbeitung der Linie

Verwandte Themen