查找没有编号的文件

查找没有编号的文件

我正在尝试编写一个简单的脚本,它将迭代除 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]"

应该可以解决问题。

相关内容