나는 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]" 찾기
그러면 문제가 해결될 것입니다.