私はsdaを除くすべてのドライブを繰り返す簡単なスクリプトを書こうとしています。今私にはこれがあります
for i in $(find /dev/ -name "sd*" ! -name "sda*")
do
echo $i
done
しかし、これにはこのようなパーティションが含まれます/dev/sdb1
が、私はこのようなルートドライブだけが欲しいです/dev/sdb
。
番号付きファイルを取得できないように find ステートメントをどのように変更しますか?
答え1
このようにコマンド置換を使用しないでください。単語の区切りを適用すると問題が発生します。ただ
find /dev/ -regex '/dev/sd[a-z]+' ! -name 'sda'
実際の目標が基本ブロックデバイスを表示することである場合を見てください/sys/block
。
答え2
その後に文字があると仮定すると、sd
文字を使用する必要はありませんfind
。あなたができる
ことbash
shopt -s nullglob
for dev in /dev/sd[!a]; do
echo "$dev"
done
一致するものがない場合、最初の行は出力されません。
編集する
不確実な数の文字に拡張するには、globを使用できます。
printf '%s\n' /dev/!(sda|*[0-9])
!(pattern)
つまりパターンを除く、特定の場合に除外されるパターンは、sda
(*[0-9]
すべて数字で終わる)です。
機能するには、拡張グローバル変数をオンにする必要があります(例shopt -s extglob
:)。
答え3
Linuxでディスクデバイスのリストを取得するには、次のことをお勧めします。
paste -s /sys/dev/block/*/uevent | sed -n '/DEVTYPE=disk/s|.*DEVNAME=\(.*\)\t.*|/dev/\1|p'
これにより、/dev/loop3 や /dev/ram12 などの潜在的なディスクのリストも表示されます。
「パーティション化可能」ディスクの実際のリストが必要な場合は、fdiskに連絡してください。
LANG="C" fdisk -l | sed -n 's|^Disk \(/.*/.*\):.*|\1|p'
その後、sdaをフィルタリングできます。
LANG="C" fdisk -l | sed -n 's|^Disk \(/.*/.*\):.*|\1|p' | grep -v sda
答え4
HD*ではなくsd*を扱っていると確信しているとします。
/dev/ -name "sd[bz]" 検索
これで問題が解決します。