2014-04-16 2 views
1

Ok 그래서 내부에 파일이없는 경우에만 디렉토리를 삭제하는 쉘 스크립트를 작성하고 있습니다.파일이없는 경우에만 디렉토리를 삭제하는 bash 쉘 스크립트

디렉토리에 파일이 있는지 확인하고 파일이있는 경우 파일을 먼저 삭제 한 다음 디렉토리를 삭제할 것인지 묻는 if 문을 가지고 싶습니다.

나는 이것에 꽤 많이 들여다 보았으며 파일이 디렉토리에 존재하는지 확인하는 방법을 찾았지만 그 단계를 지나서 만들 수는 없었다. 여기

내가 파일이 디렉토리에 존재하는지 확인하기 위해 지금까지 생성 한 if 문입니다 : 당신은 확인할 필요가 없습니다

echo "Please type the name of the directory you wish to remove " 

       read dName 
     shopt -s nullglob 
     shopt -s dotglob 
     directory=$Dname 

     if [ ${#directory[@]} -gt 0 ]; 
     then 
       echo "There are files in this directory! "; 
     else 
       echo "This directory is ok to delete! " 
     fi 
     ;; 
+0

'rmdir'은 이미 기본적으로이 작업을 수행합니다. –

+0

제쳐두고 쉘 스크립트의 경우 키보드 상호 작용 대신 (또는 적어도 보완적인)'$ @'및'$ n' 변수를 통해 인수를 사용하는 것이 더 편리합니다. –

답변

4

; rmdir은 빈 디렉토리 만 삭제합니다. 그들은 모든 것을 제거하려면

$ mkdir foo 
$ touch foo/bar 
$ rmdir foo 
rmdir: foo: Directory not empty 
$ rm foo/bar 
$ rmdir foo 
$ ls foo 
ls: foo: No such file or directory 

는 더 실용적인 설정에서는 사용자 요청하는 if 문으로 rmdir 명령을 사용할 수 있습니다.

if ! rmdir foo 2> /dev/null; then 
    echo "foo contains the following files:" 
    ls foo/ 
    read -p "Delete them all? [y/n]" answer 
    if [[ $answer = [yY] ]]; then 
     rm -rf foo 
    fi 
fi 
+0

'rmdir'는 디렉토리가 꽉 찬 경우에만 오류가 발생하지 않습니다. 따라서 stderr을 변수에 저장하고 삭제하기 전에'Directory not empty'와 같은 것을 포함하는지 확인하는 것이 좋습니다. – BroSlow

1

사용중인 구문에서 일부 언어를 혼합하는 것처럼 느껴집니다. 스크립트를 최소한으로 변경하면 bash globing을 사용하여 전체 배열 (배열을 만들 수 있지만 좋은 이유는 없습니다)을 확인할 수 있습니다. 그래도 여전히 chepner's script과 비슷한 것을 사용하고 rmdir 오류 검사를 처리합니다. 원래 구문 오류

#!/bin/bash 

echo "Please type the name of the directory you wish to remove " 

read dName 
[[ ! -d $dName ]] && echo "$dName is not a directory" >&2 && exit 1 
shopt -s nullglob 
shopt -s dotglob 

found= 
for i in "$dName"/*; do 
    found=: && break 
done 

[[ -n $found ]] && echo 'There are files in this directory!' || echo 'This directory is ok to delete!' 

참고 커플 :

  • 변수 이름은 대소 문자를 구분, $dName는 같지 않습니다 $Dname (그리고 당신이 정말로 그들이 공백이나 특수 문자가있는 경우 변수 이름을 인용한다 배열, 당신은 directory=($Dname/*)
  • ! 같은 작업을 수행하여 그것을 하나를 만들었을 수도 없습니다)
  • directory
  • 입니다 역사 EXPAN을 수행하려고합니다 옵션이있는 경우 큰 따옴표로 묶습니다.
관련 문제