3 votes

Comment utiliser les arguments de ligne de commande dans bash ?

Ce script déplace tous les fichiers doc dans un répertoire spécifié. J'ai réussi à mettre un argument mais le problème que je rencontre est de mettre le chemin complet où le script se déplace, par exemple je veux exécuter le script comme ceci ci-dessous

./loo -d then path where im moving the files (i.e ./loo -d the second argument where files are moving to)

Voici mon code

#!/bin/bash
From="/home/elg19/lone/doc"
To="/home/elg19/documents"

if [ $1 = -d ]; then
cd "$From"
for i in pdf txt doc; do
  find . -type f -name "*.${i}" -exec mv "{}" "$To" \;
done
fi

3voto

pele Points 9

Vous avez besoin de getopts. getopts est une bibliothèque conçue pour gérer les arguments de la ligne de commande pour vous, et est généralement disponible dans de nombreux langages. En bash, vous l'utilisez comme ceci :

C'est emprunté à un tutoriel que j'ai trouvé :

From="/home/elg19/lone/doc"
To="/home/elg19/documents"

while getopts "d:" optionName; do
    case "$optionName" in
        d) To="$OPTARG";;
        [?]) exit 255;;
    esac
done

[[ -d "$To" ]] || exit 255

cd "$From"
for i in pdf txt doc; do
    find . -type f -name "*.${i}" -exec mv "{}" "$To" \;
done

Ceci n'a pas été testé, mais en gros c'est juste votre script avec l'option de remplacer l'argument "$To" par des getopts.

Le bit [ ?] lui indique d'abandonner si des options non reconnues sont trouvées.

2voto

Panther Points 96601

Pour info, rsync le fera pour vous.

rsync --filter="+ *.doc" --filter="+ *.pdf" --filter="+ *.txt" --filter="- *" ~lone/doc/* ~/documents/

Vous pouvez créer un alias dans le fichier .bashrc si vous le souhaitez.

alias backup='rsync --filter="+ *.doc" --filter="+ *.pdf" --filter="+ *.txt" --filter="- *" ~lone/doc/* ~/documents/'

Si vous avez besoin de plus de *.doc, ajoutez au --filer="+ *.txt" ;)

Voir mon commentaire si vous voulez déboguer votre script. Votre problème dans votre script peut être aussi simple que votre conditionnel if [ $1 = -d ]

essayez

if [ -d "$1" ]; then

Mais je ne peux pas dire à partir de votre script quelles options vous passez et pourquoi (vous avez défini vos répertoires dans votre script).

1voto

Panther Points 96601

Avec votre commentaire le plus récent

#!/bin/bash

From="/home/elg19/lone/doc"
#To="/home/elg19/documents"

while getopts "d:" optionName; do
    case "$optionName" in
        d) To="$OPTARG";;
        [?]) exit 255;;
    esac
done

[[ -d "$To" ]] || exit 255

for i in pdf txt doc; do
    find $From -type f -name "*.${i}" -exec mv "{}" "$To" \;
done

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X