This script moves all the doc files to a specified directory. I have managed to put an argument but the problem I am facing is putting the full path where the scripts are moving to, for example I want to run the script like this below
./loo -d then path where im moving the files (i.e ./loo -d the second argument where files are moving to) this is my 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 03 Answers
You need getopts. getopts is a library designed to handle commandline arguments for you, and is generally available in many languages. In bash, you use it like this:
This is borrowed from a tutorial I found:
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 This is untested, but basically it's just your script with the option to override the "$To" argument with getopts.
The [?] bit tells it to exit if any unrecognised options are found.
12FWIW, rsync will do this for you
rsync --filter="+ *.doc" --filter="+ *.pdf" --filter="+ *.txt" --filter="- *" ~lone/doc/* ~/documents/ You can make an alias in .bashrc if you wish
alias backup='rsync --filter="+ *.doc" --filter="+ *.pdf" --filter="+ *.txt" --filter="- *" ~lone/doc/* ~/documents/' If you need more then *.doc, add to the --filer="+ *.txt" ;)
See my comment if you want to debug your script. Your problem in your script may be as simple as your conditional if [ $1 = -d ]
try
if [ -d "$1" ]; then But I can not tell from your script what options you are passing and why (you defined your directories in your script).
3With your most recent comment
#!/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 2