2016-11-29 3 views
0

J'essaie de créer un concept de corbeille de base dans une machine virtuelle en utilisant bash scripting. Il devra supprimer les fichiers qui ont été entrés et les placer dans un répertoire créé et enregistrer le chemin (origine) dans un fichier journal qui sera utilisé ultérieurement dans une fonction de restauration.Corbeille dans le script Bash

Je vais commencer avec mon code de suppression/de recyclage que je crois fonctionne très bien, mais semble un peu en désordre/contient un code redondant:

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

Par la suite ce que j'ai pour mon script de restauration est la suivante:

#!/bin/sh 

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

J'imagine que cela est un peu proche de ce que je dois retourner tout fichier supprimé stocké dans le bac journal/recyclage à restaurer à son origine, mais l'erreur que je reçois est:

mv: missing destination file operand after `' 

Des pensées sur où je vais mal?

+0

ne vous donne 'mv' un argument. Peut-être votre pensée était 'mv -i" $ 1 "" $ (grep "$ 1" "$ HOME/recycle/recycle_log") "' pour déplacer le fichier dans son entrée de journal. –

+0

@thatotherguy autre gars Cela change l'erreur à 'mv: impossible de déplacer 'example.txt' à ': Aucun fichier ou répertoire' –

+0

Je n'ai pas remarqué que vous écrivez votre journal dans' $ HOME/recycle/recycle_log/log_file 'mais demandez à votre grep de lire' $ HOME/recycle/recycle_log'. Vous pouvez utiliser 'mv -i" $ 1 "" $ (grep "$ 1" "$ HOME/recycle/recycle_log/log_file") "' pour corriger cela –

Répondre

0

Essayez ceci:

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 

Quelques idées:

set -e: Abandonner en cas d'erreur, d'éviter certains cas est

[email protected]: Le tableau d'arguments ($ 1, $ 2 ...)

[ ! -d $1 ] || return 0: Puisque nous utilisons set -e, ne manquent pas si le répertoire existe

grep "\/${name}\$" ...: correspond uniquement au nom à la fin du chemin

sed -i: sed montage en place pour supprimer la ligne