경로 아래에 중첩된 모든 디렉터리를 제거합니다.

경로 아래에 중첩된 모든 디렉터리를 제거합니다.

다음 조건을 고려해 보겠습니다.

  • 여러 가지가 있습니다중첩됨많은 폴더/파일이 설치되었습니다 /mnt.
    sdb      8:16   0   300G  0 disk
    ├─sdb1   8:17   0   256M  0 part /mnt/1/1
    ├─sdb2   8:18   0 199.7G  0 part /mnt/2
    └─sdb3   8:19   0   100G  0 part /mnt/3/1/2
    
  • /dev/sdb예를 들어 어떤 장치가 설치되어 있는지 모른다고 가정해 보겠습니다 /mnt(무인 스크립트에서 사용하고 싶기 때문입니다).
  • 마운트 디렉터리의 경로도 알 수 없습니다.
  • not mounted오류로 인해 프로세스가 중단되어서는 안 됩니다.

내가 시도한 결과에 대한 설명은 다음과 같습니다.

$ umount --all-targets --recursive /mnt; lsblk /dev/sdb
umount: /mnt: not mounted
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sdb      8:16   0   300G  0 disk
├─sdb1   8:17   0   256M  0 part /mnt/1/1
├─sdb2   8:18   0 199.7G  0 part /mnt/2
└─sdb3   8:19   0   100G  0 part /mnt/3/1/2

$ umount --all-targets --recursive /mnt/*/**; lsblk /dev/sdb
umount: /mnt/2/boot: not mounted
umount: /mnt/2/ostree: not mounted
umount: /mnt/3/1: not mounted
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sdb      8:16   0   300G  0 disk
├─sdb1   8:17   0   256M  0 part
├─sdb2   8:18   0 199.7G  0 part /mnt/2
└─sdb3   8:19   0   100G  0 part /mnt/3/1/2

$ umount --all-targets --recursive /mnt/*?; lsblk /dev/sdb
umount: /mnt/1: not mounted
umount: /mnt/3: not mounted
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sdb      8:16   0   300G  0 disk
├─sdb1   8:17   0   256M  0 part /mnt/1/1
├─sdb2   8:18   0 199.7G  0 part
└─sdb3   8:19   0   100G  0 part /mnt/3/1/2

$ umount --all-targets --recursive /mnt/*/**?; lsblk /dev/sdb
umount: /mnt/2/boot: not mounted
umount: /mnt/2/ostree: not mounted
umount: /mnt/3/1: not mounted
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sdb      8:16   0   300G  0 disk
├─sdb1   8:17   0   256M  0 part
├─sdb2   8:18   0 199.7G  0 part /mnt/2
└─sdb3   8:19   0   100G  0 part /mnt/3/1/2

추가 패키지를 설치하지 않고 이를 수행할 수 있는 좋은 방법이 있습니까?

답변1

더 좋은 방법이 있는지 알려주세요!

나는 다른 사람들을 돕기 위해 내 결과를 게시합니다.

  1. 호기심에서 나는 이것이 not mounted오류를 발생시키지 않기 때문에 매우 유용하다고 생각했지만 이것은 장치 이름이 알려져 있고 파티션/디스크 섹션당 마운트 지점이 없거나 1개인 경우에만 작동합니다.(참고로 추가하면 --all-targets설치되지 않은 오류가 발생할 수 있으므로 억제하는 것은 || true나쁜 습관입니다):

    $ umount /dev/sdb?*
    

    대신, 파티션/디스크 섹션당 여러 마운트 지점을 처리하기 위해 디스크의 모든 마운트 지점을 자동으로 마운트 해제하는 방법을 생각해냈습니다.

    $ lsblk --noheadings --output MOUNTPOINTS /dev/sdb | xargs -r umount
    
  2. 그러나 원래 질문의 문제를 해결하기 위해 다음과 같이 생각해 냈습니다.

    $ umount $(df -h --output=target | grep /mnt)
    

    뭔가가 설치된 경우에만 작동하는 것으로 나타났습니다. 여기에 더 정확한 일치를 제공하고 설치된 경우에만 제거되는 향상된 버전이 있습니다.

    $ df -h --output=target | grep -w /mnt | xargs -r umount
    

    이는 추가로 조정될 수 있습니다. 이전 버전에서는 디스크가 여러 위치에 마운트된 경우 모든 디렉터리를 나열할 수 없었습니다. 다른 방법으로 문제를 해결하세요.

    $ lsblk --output MOUNTPOINTS | grep -w /mnt | xargs -r umount
    

답변2

나는 다음을 사용할 것이다:

cd /mnt
find -type d -exec mountpoint {} \;|grep -v not|cut -d" " -f1|tac|xargs umount

그러면 /mnt 아래에 설치된 모든 디렉토리가 마운트 해제됩니다. 그게 당신이 원하는 일인 것 같아요. 여기에는 마운트 지점(/mnt 아래 마운트 지점 제외)의 장치나 경로에 대한 지식이 필요하지 않습니다. 마운트된 마운트 지점에서만 실행됩니다.

이 방법은 장치를 추측하는 대신 마운트 지점을 찾아 해당 장치가 /mnt에 마운트되어 있는지 확인하는 것입니다. 루프 마운트와 네트워크 마운트는 물론 디스크 장치를 사용한 마운트도 처리합니다.

find -type d 효율성을 위해 디렉터리를 검색합니다(파일과 디렉터리가 바인드 마운트 가능할 수도 있지만 확실하지는 않습니다). tac은 순서를 바꾸므로 먼저 계층 구조 아래의 마운트 지점을 마운트 해제합니다.

답변3

저장소 공급업체로부터 이것을 얻었으며 bash에서 작동합니다.

MOUNTDIR=/mnt

# Sort MOUNTDIR to unmount nested filesystems first
if [[ "$OS" == "AIX" ]]
then
  KEYS=$(
  for KEY in ${!MOUNTDIR[@]}
  do
    echo "${MOUNTDIR[$KEY]}:::$KEY"
  done | sort | awk -F::: '{print $2}'
  )
else
  KEYS=$(
  for KEY in ${!MOUNTDIR[@]}
  do
    echo "${MOUNTDIR[$KEY]}:::$KEY"
  done | sort -r | awk -F::: '{print $2}'
  )
fi

for OLDLV in $KEYS
do
  if [[ "$OS" == "AIX" ]]
  then
    echo "/usr/sbin/fuser -k ${MOUNTDIR[$OLDLV]}"
    if [[ -v COMMIT ]]; then /usr/sbin/fuser -k ${MOUNTDIR[$OLDLV]}; fi
    echo "umount ${MOUNTDIR[$OLDLV]}"
    if [[ -v COMMIT ]]; then umount ${MOUNTDIR[$OLDLV]}; fi
  else
    echo "fuser -kmMs ${MOUNTDIR[$OLDLV]}"
    if [[ -v COMMIT ]]; then fuser -kmMs ${MOUNTDIR[$OLDLV]}; fi
    echo "umount ${MOUNTDIR[$OLDLV]}"
    if [[ -v COMMIT ]]; then umount ${MOUNTDIR[$OLDLV]}; fi
  fi
done

관련 정보