এর জন্য মূল সুবিধার দরকার নেই (তবে এই কমান্ডগুলির মধ্যে অনেকগুলি ব্যাশিজম ব্যবহার করে এবং নির্ভর করে, সুতরাং তারা সমস্ত পসিক্স-কমপ্লায়েন্ট শেলগুলিতে কাজ করবে না):
একটি সম্পর্কে জিজ্ঞাসা করার জন্য দ্রুত উপায় রয়েছে :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
(শেষ ক্ষেত্রটিতে ফাঁকা জায়গা থাকতে পারে))