Как использовать аргументы командной строки в bash?

Этот скрипт перемещает все файлы документов в указанную директорию. Мне удалось указать аргумент, но проблема, с которой я сталкиваюсь, заключается в том, чтобы указать полный путь, по которому перемещаются скрипты, например, я хочу запустить скрипт, как показано ниже

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

, это мой код [ 113]

#!/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
3
задан 18 December 2011 в 18:55

3 ответа

FWIW, rsync сделает это за вас

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

Вы можете создать псевдоним в .bashrc, если хотите

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

Если вам нужно больше, чем * .doc, добавьте to --filer = "+ * .txt";)

Смотрите мой комментарий, если вы хотите отладить ваш скрипт. Ваша проблема в вашем сценарии может быть такой же простой, как ваша условная if [ $1 = -d ]

try

if [ -d "$1" ]; then

Но я не могу сказать из вашего сценария, какие параметры вы передаете и почему (вы определили каталоги в вашем скрипте).

0
ответ дан 18 December 2011 в 18:55

Вы нуждаетесь в getopts. getopts - это библиотека, разработанная для обработки аргументов командной строки, которая обычно доступна на многих языках. В 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

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

Это не проверено, но в основном это просто ваш скрипт с возможность переопределить аргумент "$ To" с помощью getopts.

Бит [?] Сообщает о выходе, если найдены какие-либо нераспознанные опции.

0
ответ дан 18 December 2011 в 18:55

С вашим последним комментарием

#!/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
0
ответ дан 18 December 2011 в 18:55

Другие вопросы по тегам:

Похожие вопросы: