2

名前に日付が付いたファイルまたはディレクトリをコピーするためのスクリプトを作成しています。たとえば、ファイル名testtest-20130901.bkup

これが私のスクリプトです

#!/usr/bin/bash
set -x

getopts fd TYPE
[ $TYPE = "d" ] && alias cp="cp -r"

backup_error() {
        echo "${0##*/}: $1"
        exit -1
}

typeset -r FROM_DIR=$2 TO_DIR=$3
if [ ! -e $FROM_DIR -a ! -d $FROM_DIR ] || [ ! -e $TO_DIR -a ! -d $TO_DIR ]
then
        backup_error "One of the directories isn't exist or it maybe a file";
fi

typeset -r DATE=$(date "+%Y%m%d")
for filename in $FROM_DIR/*
do
        if [ -$TYPE $filename ]
        then
                cp $filename $TO_DIR/${filename##*/}-$DATE.bkup
        fi
done

unalias cp

スクリプトでは、ユーザーがスクリプトをファイルのみで実行するか、ディレクトリのみで実行するかを確認します。 -fファイルのみ -dディレクトリのみ

[ $TYPE = "d" ] && alias cp="cp -r"、この行は、使用する必要があるディレクトリに対してスクリプトが実行されるかどうかを確認するcp -rため、エイリアスを作成cpしますcp -r

しかし、set -xデバッグに使用すると、ユーザーが-dオプションを使用するときにコマンドがエイリアスではなく元のcpコマンドであることがわかります。if

デバッグ:

> ./backup.sh -d . .
+ getopts fdb TYPE
+ '[' d = d ']'
+ alias 'cp=cp -r'
+ typeset -r FROM_DIR=. TO_DIR=.
+ '[' '!' -e . -a '!' -d . ']'
+ '[' '!' -e . -a '!' -d . ']'
++ date +%Y%m%d
+ typeset -r DATE=20130901
+ '[' -d ./backup.sh ']'
+ '[' -d ./dir1 ']'
+ cp ./dir1 ./dir1-20130901.bkup
cp: ./dir1: is a directory
+ '[' -d ./file1 ']'
+ '[' -d ./file2 ']'
+ '[' -d ./test.sh ']'
+ unalias cp
4

1 に答える 1

2

代わりに関数を使用します。

if [[ $TYPE == d ]]; then
    function cp {
        command cp -r "$@"
    }
fi

また、Bash の場合は、 orより[[ ]]も推奨されます。test[ ]

""また、単語の分割や予期しないパス名の拡張を防ぐために、変数を適切に引用してください。

その他の注意事項:

    exit -1  ## exit can only accept 8-bit integral values from 0 to 255. -1 here is orthodox and is equivalent to 255.

ここで変数を引用するか、次を使用する必要があります[[ ]]

    if [[ ! -e $FROM_DIR && ! -d $FROM_DIR ]] || [[ ! -e $TO_DIR && ! -d $TO_DIR ]]

    if [ "-$TYPE" "$filename" ]  ## for custom operators, test is better: test "-$TYPE" "$filename"

            cp "$filename" "$TO_DIR/${filename##*/}-$DATE.bkup"

for filename in "$FROM_DIR"/*

最後に、スクリプトを次のように実行していることを確認してください。

bash script.sh -f from_dir to_dir
# Or
bash script.sh -d from_dir to_dir
于 2013-09-01T15:39:00.543 に答える