এর জন্য মূল সুবিধার দরকার নেই (তবে এই কমান্ডগুলির মধ্যে অনেকগুলি ব্যাশিজম ব্যবহার করে এবং নির্ভর করে, সুতরাং তারা সমস্ত পসিক্স-কমপ্লায়েন্ট শেলগুলিতে কাজ করবে না):
একটি সম্পর্কে জিজ্ঞাসা করার জন্য দ্রুত উপায় রয়েছে :sdX
grep -H . /sys/block/sda/{capability,uevent,removable,device/{model,type,vendor,uevent}}
/sys/block/sda/capability:52
/sys/block/sda/uevent:MAJOR=8
/sys/block/sda/uevent:MINOR=0
/sys/block/sda/uevent:DEVNAME=sda
/sys/block/sda/uevent:DEVTYPE=disk
/sys/block/sda/removable:0
/sys/block/sda/device/model:WDC WD360GD-00FN
/sys/block/sda/device/type:0
/sys/block/sda/device/vendor:ATA
/sys/block/sda/device/uevent:DEVTYPE=scsi_device
/sys/block/sda/device/uevent:DRIVER=sd
/sys/block/sda/device/uevent:MODALIAS=scsi:t-0x00
সত্যিই আকর্ষণীয় ফাইল capability
। আমার ডেবিয়ানে, আমার কাছে একটি genhd.h
ফাইল রয়েছে, তাই:
eval $(sed -ne '
s/#define.*GENHD_FL_\([A-Z0-9_]*\)[ \t]*\([0-9]*\) \?.*$/GENHD_FLAGS[\2]="\1"/p
' /usr/src/linux-headers-2.6.32-5-common-openvz/include/linux/genhd.h)
diskCapa=$(</sys/block/sda/capability)
for i in ${!GENHD_FLAGS[@]};do
(( diskCapa & i )) && echo ${GENHD_FLAGS[i]}
done
MEDIA_CHANGE_NOTIFY
UP
SUPPRESS_PARTITION_INFO
diskCapa=$(</sys/block/sdd/capability)
for i in ${!GENHD_FLAGS[@]};do
(( diskCapa & i )) && echo ${GENHD_FLAGS[i]}
done
REMOVABLE
MEDIA_CHANGE_NOTIFY
UP
SUPPRESS_PARTITION_INFO
removable
মোটেও, পতাকা নির্ধারণ করা হয়েছে কিনা তা কেবল জানতে :
grep REMOVABL /usr/src/linux-headers-3.2.0-4-common/include/linux/genhd.h
#define GENHD_FL_REMOVABLE 1
সুতরাং
for disk in sd{a,b,c,d,e,f,g,h} ; do
(( $(< /sys/block/$disk/capability ) & 1 )) && echo $disk is removable
done
পরীক্ষা করিয়া করে কাজ করে capability
মান (যা আমার মধ্যে 52 sda
উদাহরণস্বরূপ, উপরোক্ত) আছে 1
বিট সেট (অর্থাত, তা একটি বিজোড় সংখ্যা) হয়।
তবে লিনাক্স সমস্ত পতাকা রেন্ডার করে /sys
, তাই চাইতে /sys/block/sdX/removable
অনেক সহজ! ;-)
সুতরাং একটি USB কী হতে পারে removable
, কিন্তু সেখানে প্রচুর আছে অপসারণযোগ্য ডিভাইস, আমি তা নিশ্চিত করার জন্য পছন্দ করেন আকার মাঝারি 0 চেয়ে বেশী (কোনো আনলোড সিডি-রম ট্রে মত, নমুনা জন্য)
এবং যে ডিভাইস হয় না এ ব্যবহার: যে দেখার মধ্যেsdX/trace/enable
আবদ্ধ হয় না:
নোটা: এগুলি সমস্ত ভাল v4.2 + এ পরীক্ষিত।
বাশ এর অধীনে , আপনি এই খুব দ্রুত এবং দক্ষ উপায় ব্যবহার করতে পারেন:
for disk in /sys/block/* ; do
[ -f "$disk/removable" ] && [ $(<"$disk/removable") -gt 0 ] &&
[ -f "$disk/size" ] && [ $(<"$disk/size") -gt 0 ] &&
[ -f "$disk/trace/enable" ] && [ -z "$(<"$disk/trace/enable")" ] &&
echo "${disk##*/} $(($(<"$disk/size")/1953125))G $(<"$disk/device/model")"
done
আমার সিস্টেমে 4 টি ইউএসবি কী রয়েছে তবে এর মধ্যে একটি ( sde
) ইতিমধ্যে মাউন্ট করা হয়েছে, সুতরাং পূর্ববর্তী কমান্ড আউটপুট:
sdd 8G Trans-It Drive
sdf 7G Storage Media
sdg 4G silicon-power
আমার লিপি:
আপলোডড ডেবিয়ান লাইভ ইনস্টল করতে আমি লিখেছিলাম একটি ছোট বাশ ফাংশন।
#!/bin/bash
txtsize() {
local _c=$1 _i=0 _a=(b K M G T P)
while [ ${#_c} -gt 3 ] ; do
((_i++))
_c=$((_c>>10))
done
_c=000$(( ( $1*1000 ) >> ( 10*_i ) ))
((_i+=${3:-0}))
printf -v ${2:-REPLY} "%.2f%s" ${_c:0:${#_c}-3}.${_c:${#_c}-3} ${_a[_i]}
}
# প্রথম অংশটি কেবল মানব পাঠযোগ্য আকারকে উপস্থাপন করে। ফাংশন শুরু হয় সেখানে।
chooseFreeUsbKey() {
local _lUdisk _lUsize _lUdialog=dialog # whiptail # gdialog
local -A _lUdevices
unset ${1:-REPLY}
for _lUdisk in /sys/block/*; do
[ -f $_lUdisk/removable ] && [ $(<$_lUdisk/removable) -gt 0 ] &&
[ -f $_lUdisk/size ] && [ $(<$_lUdisk/size) -gt 0 ] &&
txtsize $(<$_lUdisk/size)*512 _lUsize &&
[ -f $_lUdisk/trace/enable ] && [ -z "$(<$_lUdisk/trace/enable)" ] &&
_lUdevices[${_lUdisk##*/}]="$_lUsize $(<$_lUdisk/device/model)"
done
case ${#_lUdevices[@]} in
0 ) ;; # echo Sorry no key found. ;;
1 ) IFS=§ read -a ${1:-REPLY} \
<<< "${!_lUdevices[@]}§${_lUdevices[@]%% *}§${_lUdevices[@]#* }";;
* ) declare -a menu
for _lUdisk in ${!_lUdevices[@]}; do
menu+=($_lUdisk "${_lUdevices[$_lUdisk]}")
done
_lUdisk=$($_lUdialog --menu "Choose a USB stick" \
$((LINES-3)) $((COLUMNS-3)) $((LINES-8)) \
"${menu[@]}" 2>&1 >/dev/tty)
IFS=§ read -a ${1:-REPLY} \
<<< "$_lUdisk§${_lUdevices[$_lUdisk]%% *}§${_lUdevices[$_lUdisk]#* }"
esac
}
এটি প্রথম আর্গুমেন্ট হিসাবে দেওয়া বা ভেরিয়েবলকে একটি অ্যারে হিসাবে উত্তরটি বরাদ্দ করে $REPLY
:
chooseFreeUsbKey stick
echo "$stick"
sdf
echo "${stick[1]}"
7.26G
echo "${stick[2]}"
Storage Media
(শেষ ক্ষেত্রটিতে ফাঁকা জায়গা থাকতে পারে))