私たちはないディスクだけを印刷したいと思います。ファイルシステムコマンドライン経由
次の例では、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」から削除してください。これは2番目のオプションではうまく機能します(ただし、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
必要があります。