2010-04-27 4 views
1

rmv라는 안전한 삭제 명령 인 "Sams 'Teach Yourself Linux in 24 Hours"에서 bash 스크립트를 적용하려고합니다. 파일은 rmv -d file1 file2 등을 호출하여 제거됩니다. 원본 스크립트에서 변수 $ 1 $ 2 $ 3 $ 4를 사용하여 최대 4 개의 파일을 제거 할 수 있습니다. 와일드 카드를 사용하여이 파일을 무제한으로 확장하려고합니다. 그래서 내가 할 :bash의 와일드 카드에서 문자열 제외

for i in $* 
do 
mv $i $HOME/.trash 
done 

파일 괜찮 삭제되지만 명령 RMV -d의 옵션 -d는 인수로 취급되고, bash는 그것을 찾을 수 없다는 객체. 이 작업을 수행하는 더 좋은 방법이 있습니까?

감사합니다, 피터

#!/bin/bash 
# rmv - a safe delete program 
# uses a trash directory under your home directory 
mkdir $HOME/.trash 2>/dev/null 
# four internal script variables are defined 
cmdlnopts=false 
delete=false 
empty=false 
list=false 
# uses getopts command to look at command line for any options 
while getopts "dehl" cmdlnopts; do 
    case "$cmdlnopts" in 
    d) /bin/echo "deleting: \c" $2 $3 $4 $5 ; delete=true ;; 
    e) /bin/echo "emptying the trash..." ; empty=true ;; 
    h) /bin/echo "safe file delete v1.0" 
     /bin/echo "rmv -d[elete] -e[mpty] -h[elp] -l[ist] file1-4" ;; 
    l) /bin/echo "your .trash directory contains:" ; list=true ;; 
    esac 
done 

if [ $delete = true ] 
then 
    for i in $* 
    do 
    mv $i $HOME/.trash 
    done 
    /bin/echo "rmv finished." 
fi 
if [ $empty = true ] 
then 
    /bin/echo "empty the trash? \c" 
    read answer 
    case "$answer" in 
    y) rm -i $HOME/.trash/* ;; 
    n) /bin/echo "trashcan delete aborted." ;; 
    esac 
fi 
if [ $list = true ] 
then 
    ls -l $HOME/.trash 
fi 
+0

또한 :'d) echo -e "삭제 : \ n" "$ {@ : 2}"; delete = true ;;'- 이것은 Bash의 내장 echo를 사용합니다 (왜'/ bin/echo'를 사용합니까?) 모든 파일 이름을 인쇄합니다. 그리고 이것은 기능의 변경을 더 잘 나타낼 것입니다 :'echo "rmv -d [elete -e [mpty] -h [elp] -l [ist] file [...]";;' –

+1

원한다면 원격으로 안전하다. PE ("$ foo"가 아닌 $ foo)를 인용하고 인수를 유지하는 방법을 배우는 것이 좋습니다. $ *를 사용하지 말고 항상 "$ @"을 사용하십시오. 이 충고에 유의하지 않으면; 특히 'rm'할 때; 당신은 잘못된 명령을 곧 삭제할 올바른 명령을 찾을 수 있습니다. – lhunath

답변

0

현재 shift를 사용할 수있다.

-dswitch의 옵션 중 하나라면 위치 매개 변수에서 -d을 이동하여 제거 할 수 있습니다. 다음으로 할 수 있습니다

until [ -z $1 ] ; do 
mv $1 $HOME/.trash 
shift 
done 
0

getopts 세트 옵션 후 첫 번째 인수의 인덱스에 OPTIND. (#)

그래서 옵션을 구문 분석 후 당신은 할 수 있습니다 :

shift $OPTIND-1 

는 인수 목록에서 옵션을 제거합니다.

그런 다음 $ *가 아닌 "[email protected]"을 사용하면 공백이있는 파일을 처리 할 수 ​​있습니다.

0

고맙습니다.

내가 읽을 수있는 코드를 변경 :이 원하는대로 파일을 삭제

#!/bin/bash 
# rmv - a safe delete program 
# todo: add ability to handle wildcards 
# uses a trash directory under your home directory 
mkdir $HOME/.trash 2>/dev/null 
# four internal script variables are defined 
cmdlnopts=false 
delete=false 
empty=false 
list=false 
# uses getopts command to look at command line for any options 
while getopts "dehl" cmdlnopts; do 
    case "$cmdlnopts" in 
    d) echo -e "deleting: \n" "${@:2}" ; delete=true ;; 
    e) echo -e "emptying the trash..." ; empty=true ;; 
    h) echo -e "safe file delete v1.0" 
     echo -e "rmv -d[elete] -e[mpty] -h[elp] -l[ist] file [...]" ;; 
    l) echo -e "your .trash directory contains:" ; list=true ;; 
    esac 
done 
shift $OPTIND-1 

if [ $delete = true ] 
then 
    for i in [email protected] 
    do 
    mv $i $HOME/.trash 
    done 
    echo "rmv finished." 
fi 
then 
    /bin/echo "empty the trash? \c" 
    read answer 
    case "$answer" in 
    y) rm -i $HOME/.trash/* ;; 
    n) /bin/echo "trashcan delete aborted." ;; 
    esac 
fi 
if [ $list = true ] 
then 
    ls -l $HOME/.trash 
fi 

하지만이 오류 얻을 : 당신은 얻을

shift $(($OPTIND - 1)) 

를 사용할 필요가

/home/peter/rmv: line 21: shift: 2-1: numeric argument required 
mv: invalid option -- 'd' 
Try `mv --help' for more information. 
0

을 처리 된 명령 행 args의 빨간색. 이 버전보십시오 : 늦게 파티에

#!/bin/bash 
# rmv - a safe delete program 
# uses a trash directory under your home directory 
mkdir -p $HOME/.trash 

# uses getopts command to look at command line for any options 
while getopts "dehl" cmdlnopts; do 
    case "$cmdlnopts" in 
    d) delete=true;; 
    e) echo "emptying the trash..." ; empty=true ;; 
    h) echo "safe file delete v1.0" 
      echo "rmv -d[elete] -e[mpty] -h[elp] -l[ist] files" ;; 
    l) echo "your .trash directory contains:" ; list=true ;; 
    esac 
done 

shift $(($OPTIND - 1)) 

if [ -n "${delete}" ]; then 
    echo "deleting: " "${@}" 
    mv ${@} $HOME/.trash 
    echo "rmv finished." 
fi 

if [ -n "${empty}" ]; then 
    read -p "empty the trash? " answer 
    case "$answer" in 
    y) rm -i $HOME/.trash/* ;; 
    n) echo "trashcan delete aborted." ;; 
    esac 
fi 

if [ -n "${list}" ]; then 
    ls -l $HOME/.trash 
fi 
+0

환상적입니다. 고마워요! –

0

을하지만, Google 직원이 베드로 설명하는 오류가 발생합니다 :

shift $OPTIND-1 

을있는 동안 위르겐의 회신 구문은하지 않습니다 :

shift $(($OPTIND-1)) 

문제는 $ OPTIND-1이 문자열로 해석되고 shift가 문자열을 인수로 사용할 수 없다는 것입니다. $ (())는 Bash의 arithmetic expansion operator입니다. 문자열을 그 안에 넣으면 문자열이 산술 표현식으로 평가되고 값이 반환됩니다.