我正在尝试编写一个简单的脚本,它将迭代除 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
假设您确定您正在处理 sd* 而不是 hd*
查找 /dev/ -name "sd[bz]"
应该可以解决问题。