우리는 없는 디스크만 인쇄하고 싶습니다.파일 시스템명령줄을 통해
아래 예에서 sde
디스크에 파일 시스템이 없음 을 알 수 있습니다.
lsblk -o NAME,FSTYPE
NAME FSTYPE
sda
├─sda1 xfs
└─sda2 LVM2_member
├─vg-LV_root xfs
├─vg-LV_swap swap
├─vg-LV_var xfs
└─vg-LV_docker xfs
sdb ext4
sdc ext4
sdd ext4
sde
그래서 우리는 FS 없이 디스크를 캡처하기 위해 다음 명령을 시도합니다.
lsblk -o NAME,FSTYPE | awk '$2 == "" { print $0 }'
우리는 얻었다
sda
sde
sda
위에 인쇄된 디스크에서 볼 수 있듯이 sda
운영 체제 디스크이므로 명령줄에서 올바른 출력이 제공되지 않습니다.
올바른 출력은 다음과 같아야 합니다.
sde
올바른 출력을 제공하기 위한 제안이나 다른 방법이 있습니까?
lsblk -oNAME,FSTYPE,FSTYPE --noheadings --nodeps
sda
sdb ext4 ext4
sdc ext4 ext4
sdd ext4 ext4
sde
답변1
메서드에서 lsblk에 fdisk(및 몇 가지 간단한 도우미 도구)를 추가하는 것이 좋습니다. 다음 쉘스크립트는 내 테스트 케이스에서 작동합니다.
#!/bin/bash
for i in $(lsblk -dno name|grep -v sr)
do
LANG=C
sudo fdisk -lu "/dev/$i" |
tr '\n' ' ' |
grep 'Disk ' |
grep -v 'Disklabel type:' |
grep -o "/dev/$i"
done
이는 클린 드라이브를 식별합니다(디스크 레이블 별칭 파티션 테이블 없음).
파티션 테이블과 파티션은 있지만 파티션(또는 스왑 공간)에 파일 시스템이 없는 드라이브를 보려면 lsblk(및 몇 가지 간단한 도우미 도구)만 사용하는 다음 쉘 스크립트를 사용해 보십시오.
#!/bin/bash
for i in $(lsblk -dno name|grep -v sr)
do
LANG=C
echo -n "/dev/$i "
lsblk -lno fstype "/dev/$i" | tr '\n' ' '
echo ""
done | sed 's/ *$//' | grep -v '\ [a-z]*'
편집하다:
가끔 CD/DVD 드라이브를 보고 싶다면 |grep -v sr
"for-line"에서 제거하시기 바랍니다. 이것은 두 번째 옵션에서는 잘 작동합니다(그러나 fdisk가 "fdisk: can open /dev/sr0: media notfound"를 통해 do 루프에서 빠져 나올 수 있기 때문에 첫 번째 옵션에서는 잘 작동하지 않습니다).
답변2
귀하의 질문에 대한 입력/출력을 기반으로 합니다.
$ cat tst.awk
NF == 1 { hits[$1] }
/^[^[:alpha:]]/ { delete hits[prev] }
{ prev = $1 }
END {
for ( name in hits ) {
print name
}
}
$ cat file | awk -f tst.awk
sde
분명히 .cat file
lsblk -o NAME,FSTYPE
답변3
PTTYPE
또한 파티션 테이블이 파일 시스템이 아닌지 확인해야 합니다 . --no-deps
디스크에만 관심이 있는 경우 다음을 사용하여 모든 하위 장치를 제거할 수도 있습니다.
$ lsblk -oNAME,PTTYPE,FSTYPE --noheadings --nodeps | awk '$2 == "" && $3 == "" { print $0 }'
sdb
그러나 이는 "파일 시스템이 없는 디스크"에 대한 정의에 따라 달라집니다. 앞서 말했듯이 파티션 테이블은 파일 시스템이 아니므로 명령이 유효한 결과를 제공하면 문제가 있습니다. 파티션 테이블이 있는 디스크 파티션이 비어 있는지 여부 . 파티션 테이블은 있지만 파티션은 없는 디스크를 반환하려면 lsblk
이보다 더 복잡한 것을 사용해야 합니다.