.txt 파일이 포함된 비어 있지 않은 디렉토리를 삭제하려고 할 때 프롬프트를 표시하고 싶습니다 rmdir
. 가능합니까?
답변1
@Praveen J Kumar, 잘 모르겠어서 기본 사항만 다루도록 하겠습니다. 여기에는 네 가지 상황이 있습니다.
너하다디렉터리를 삭제할 때 메시지를 표시하고 싶습니다.
-i
플래그는 대화형 세션용이며 각 파일을 삭제하기 전에 묻습니다.-r
재귀를 위해, 즉 전체 디렉토리와 하위 디렉토리 등을 순회하는 경우 다음을 사용하십시오.$ rm -ri <directory path>
너아니요디렉토리를 삭제할 때 메시지를 표시하려면 다음을 사용하십시오.
$ rm -r <directory path>
당신이 원하는디렉토리에서 특정 유형의 파일만 삭제. 이렇게 하려면 출력에서 형식이 지정되지 않은 모든 파일을 선택
ls -1
하는 입력 줄을 제공하는 다음 줄을 사용할 수 있습니다 ( 여기서 플래그는 대소문자를 구분하지 않으며 "jpg" 문자열을 제외한 모든 항목에 적용됨 . 예를 들어 다음을 제외한 디렉터리의 모든 파일을 삭제하고 싶습니다 .grep -iv "jpg"
ls
jpg
-i
-v
xargs rm
rm
grep
jpg
$ ls -1 one.txt three.jpg three.csv three.sh two.txt $ ls -1 | grep -iv "jpg" | xargs rm $ ls three.jpg
rmdir
비어 있지 않은 디렉토리는 기본적으로 삭제되지 않으므로 괜찮습니다 :-).
최종 참고 사항: 플래그를 선택할 때 -i
디렉토리에 파일이 많으면 각 파일에 대한 메시지가 표시되므로 지루해질 수 있습니다.
답변2
디렉토리 삭제를 확인하려는 경우 명령과 같은 플래그를 제공 rmdir
하지 않습니다 . 그러나 빈 디렉토리에서 작업할 때는 종료 코드를 반환합니다 . 예를 들어:-i
rm
rmdir
0
$ 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
및 를 사용한다는 점을 제외하면 두 번째 접근 방식에도 동일하게 적용됩니다 .popd
push
pop
내부적으로 어떻게 작동하는지 궁금하신가요?
set -x
바로 아래 및 바로 뒤에 배치 하고 #!/bin/bash
제거합니다 .>/dev/null
pushd
popd
두 번째 방법은 다음을 사용합니다 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