如何使用 Bash 脚本揭示驱动器状态?

如何使用 Bash 脚本揭示驱动器状态?

使用 Ubuntu 20.04.4
GNU bash,版本 5.1.16(1)-release(x86_64-pc-linux-gnu)

在 bash 脚本中,如何声明
像 (/home/u3/Music/x) 这样的目录并获取:

  • 分区类型和
  • 上述目录的该驱动器的文件系统是否已发布到屏幕上?

脚本中提供了一个目录,用于比较两个目录。
以下是 4 个示例目录:

src1='/media/u3/F_4GB_FAT32' # usb 驱动器 F 4GBytes Fat32 文件系统
src1='/media/u3/s_931GBNmbr/1' # Sata HDD 驱动器 931 GB,Ntfs 文件系统,主引导记录
src1='/media/u3/u7451GBGPTn/z1' # usb 7451GB = 8TB,GPT 分区,Ntfs 文件系统
src1='/home/u3/Music/x' # SDD ubuntu 驱动器

src1 是源目录,
dest 是目标目录

取得了一些成功:

lsblk -o pttype,mountpoint,LABEL,TRAN,SIZE,FSUSE%,fstype,kname,path | head -n1 ;  
lsblk -o pttype,mountpoint,LABEL,TRAN,SIZE,FSUSE%,fstype,kname,path | grep '/media/u3/s_931GBmbrN' ; 

给予:

PTTYPE MOUNTPOINT                   LABEL       TRAN     SIZE FSUSE% FSTYPE   KNAME  PATH
dos    /media/u3/s_931GBmbrN        s_931GBmbrN        931.5G    46% ntfs     sdc1   /dev/sdc1

dos = mbr = MBR = 主引导记录分区类型和
ntfs = 文件系统类型,新技术文件系统


但是当目录是其他目录时,上述命令很容易中断,例如:
/home/u3/Music/x

因为
grep '/home/u3/Music/x'
结果为空白,没有结果。

在 bash 脚本中,如何声明
像 (/home/u3/Music/x) 这样的目录并获取:

  • 分区类型和

  • 上述目录的驱动器的文件系统

--

答案1

使用findmnt,取决于你想要什么:

findmnt -nfo FSTYPE -T /home/u3/Music/x
findmnt -nfo SOURCE -T /home/u3/Music/x
findmnt -nfo TARGET -T /home/u3/Music/x
findmnt -nfo FSTYPE,SOURCE,TARGET -T /home/u3/Music/x

您可以从中获得更多信息findmnt。阅读man 8 findmntfindmnt --help

您可以从以下网址获取一些信息stat

stat -fc %T /home/u3/Music/x
stat -c %m /home/u3/Music/x

man 1 stat参阅详情。


例子:

file=/home/u3/Music/x
device="$(findmnt -nvfo SOURCE -T "$file")"

# information obtained, now we can use it

[ "$device" ] && lsblk "$device"
[ "$device" ] && df -h "$device"
[ "$device" ] && sudo file -s "$device"

答案2

除了上述答案之外......
bash 脚本所需输出的示例:

  • 分区类型和

  • 目录的文件系统
/home/u3/Music/x  

使用卡米尔的答案:

file=/home/u3/Music/x ; device="$(findmnt -nvfo SOURCE -T "$file")" ;  

简短脚本:

[ "$device" ] && lsblk -o PTTYPE,FSTYPE "$device" ; echo "$file" ;  

屏幕答案:

PTTYPE FSTYPE
dos    ext4
/home/u3/Music/x

更长的脚本:

[ "$device" ] && lsblk -o PTTYPE,FSTYPE,PATH,NAME,MODEL,SIZE,FSAVAIL,FSUSED,FSUSE%,LABEL,MOUNTPOINT "$device" ; echo "$file" ;   

屏幕:

PTTYPE FSTYPE PATH      NAME MODEL   SIZE FSAVAIL FSUSED FSUSE% LABEL MOUNTPOINT
dos    ext4   /dev/sda5 sda5       111.3G   58.6G  44.9G    41%       /
/home/u3/Music/x

注意,结果与

stat -fc %T /home/u3/Music/x

ext2/ext3

因为这表示文件系统ext4不是ext2/ext3

[ "$device" ] && lsblk -o FSTYPE "$device" ; echo "$file" ;  
FSTYPE
ext4
/home/u3/Music/x

发布新问题?还是留在这里?
8000GB = 8TB USB 驱动器说:

file=/media/u3/u7451GBGPTn ; device="$(findmnt -nvfo SOURCE -T "$file")" ; [ "$device" ] && lsblk -o PTTYPE,FSTYPE "$device" ; 
PTTYPE FSTYPE
atari  ntfs

没有外部来源(网页)...
我们如何才能在 bash 脚本中阐明
atariPTTYPE(分区类型)的含义
gpt
GPT = Guid 分区表,
Guid = 全局唯一标识符

--

答案3

使用 Kamil 的答案......

目录的分区类型状态的一行输出/home/u3/Music/x

src1='/home/u3/Music/x' ; clear ; echo " one line PTTYPE status (Partition Type): " ; tput sgr0 ; device="$(findmnt -nvfo SOURCE -T "$src1")" ; [ "$device" ] && lsblk -o PTTYPE "$device" | paste -sd ' ' | tr '\n' ' ' ; tput setaf 12 ; echo "$src1" ;

屏幕:

PTTYPE dos /home/u3/Music/x

以及
目录的文件系统状态的一行输出/home/u3/Music/x

src1='/home/u3/Music/x' ; clear ; echo " one line FSTYPE status (File System): " ; tput sgr0 ; device="$(findmnt -nvfo SOURCE -T "$src1")" ; [ "$device" ] && lsblk -o FSTYPE "$device" | paste -sd ' ' | tr '\n' ' ' ; tput setaf 12 ; echo "$src1" ;

屏幕:

FSTYPE ext4 /home/u3/Music/x

使用粘贴命令,将两行合并为一行
u3 = user3
src1=源目录,发送目录。

--

相关内容