디렉토리가 아닌 항목을 삭제할 때 프롬프트 표시

디렉토리가 아닌 항목을 삭제할 때 프롬프트 표시

.txt 파일이 포함된 비어 있지 않은 디렉토리를 삭제하려고 할 때 프롬프트를 표시하고 싶습니다 rmdir. 가능합니까?

답변1

@Praveen J Kumar, 잘 모르겠어서 기본 사항만 다루도록 하겠습니다. 여기에는 네 가지 상황이 있습니다.

  1. 하다디렉터리를 삭제할 때 메시지를 표시하고 싶습니다. -i플래그는 대화형 세션용이며 각 파일을 삭제하기 전에 묻습니다. -r재귀를 위해, 즉 전체 디렉토리와 하위 디렉토리 등을 순회하는 경우 다음을 사용하십시오.

    $ rm -ri <directory path>
    
  2. 아니요디렉토리를 삭제할 때 메시지를 표시하려면 다음을 사용하십시오.

    $ rm -r <directory path>
    
  3. 당신이 원하는디렉토리에서 특정 유형의 파일만 삭제. 이렇게 하려면 출력에서 ​​형식이 지정되지 않은 모든 파일을 선택 ls -1하는 입력 줄을 제공하는 다음 줄을 사용할 수 있습니다 ( 여기서 플래그는 대소문자를 구분하지 않으며 "jpg" 문자열을 제외한 모든 항목에 적용됨 .​ 예를 들어 다음을 제외한 디렉터리의 모든 파일을 삭제하고 싶습니다 . grep -iv "jpg"lsjpg-i-vxargs rmrmgrepjpg

    $ ls -1
    one.txt
    three.jpg
    three.csv
    three.sh
    two.txt
    $ ls -1 | grep -iv "jpg" | xargs rm
    $ ls
    three.jpg
    
  4. rmdir비어 있지 않은 디렉토리는 기본적으로 삭제되지 않으므로 괜찮습니다 :-).

최종 참고 사항: 플래그를 선택할 때 -i디렉토리에 파일이 많으면 각 파일에 대한 메시지가 표시되므로 지루해질 수 있습니다.

답변2

디렉토리 삭제를 확인하려는 경우 명령과 같은 플래그를 제공 rmdir하지 않습니다 . 그러나 빈 디렉토리에서 작업할 때는 종료 코드를 반환합니다 . 예를 들어:-irmrmdir0

$ mkdir emptydir && rmdir emptydir && echo $?
0

보시다시피, 빈 디렉터리를 삭제할 때 확인을 요청하지 않습니다. 확인 메커니즘을 구축할 수 있는 유일한 방법은 rmdir래퍼라고 부르는 것을 작성하는 것입니다 rmemptydir. 나는 두 가지 다른 접근 방식을 보여주기 위해 두 가지 버전을 작성했습니다.

선호하는 방법

#!/bin/bash

    [[ $# = 0 ]] &&  printf '%s\n' "rmdir [dirname]" exit 1
     shopt -s nullglob dotglob
    files=( ${1+"$1/"}* )
    (( ${#files[*]} )) || { rm -ri "$1" && exit 1; } && printf '%s\n' "Dir not empty" 
    shopt -u nullglob dotglob

1) 스크립트는 디렉터리 이름인 하나의 매개 변수를 허용합니다. 매개변수가 제공되지 않으면 종료

2) 위치파라미터 $1저장 디렉터리(요소를 포함하는 배열)

3) 배열의 요소 수를 확인하고 그렇지 않은 경우 else 실행 0으로 이동 하면 완료됩니다.printf '%s\n' "Dir not empty"rm -ri "$1" && exit 1

스택의 디렉터리와 스택의 디렉터리 에 pushd및 를 사용한다는 점을 제외하면 두 번째 접근 방식에도 동일하게 적용됩니다 .popdpushpop

내부적으로 어떻게 작동하는지 궁금하신가요?

set -x바로 아래 및 바로 뒤에 배치 하고 #!/bin/bash 제거합니다 .>/dev/nullpushdpopd

두 번째 방법은 다음을 사용합니다 pushd.popd

#!/bin/bash

 if [[ $# = 0 ]]; then
    printf '%s\n' "rmdir [dirname]" 
    exit 1
 fi
 shopt -s nullglob dotglob
  pushd "$1" >/dev/null
  files=(*)
  (( ${#files[*]} )) || { popd >/dev/null && rm -ri "$1" && exit 0 ;} && printf '%s\n' "Dir not empty" 
  shopt -u nullglob dotglob

rmdir빈 디렉터리만 삭제할 수 있고 music.mp3디렉터리에 하나가 있기 때문에 다음은 작동하지 않습니다 .

mkdir emptydir && touch emptydir/music.mp3 && rmdir emptydir && echo $?
rmdir: failed to remove ‘emptydir’: Directory not empty

관련 정보