使用BASH nullglob来验证目录中是否存在* .c文件

时间:2020-01-09 10:37:25  来源:igfitidea点击:

BASH下nullglob变量的用法?
如何检查任何目录中的任何* .c文件?

BASH shell具有以下两个特殊变量来控制路径名的扩展。

Bash扫描每个单词以查找字符* 、?和[。
如果出现这些字符之一,则将该单词视为一个模式,并替换为与该模式匹配的按字母顺序排序的文件名列表。

  • nullglob:如果设置,bash允许不匹配文件的模式扩展为空字符串,而不是扩展为它们自己。
    这对于检查目录中的任何* .mp3或* .cpp文件很有用。

  • dotglob如果设置,bash包含以a开头的文件名。
    扩展路径名的结果。

如何设置和取消设置nullglob变量?

使用shopt命令切换变量的值。

-s选项启用nullglob效果,-u选项禁用nullglob选项。

shopt -s nullglob # enable 
shopt -u nullglob # disable

这是示例shell脚本,以查看目录中是否存在* .mp3:

#!/bin/bash
old=$(cd)
[ $# -eq 0 ] && exit 1
[ -d  ] && cd  || exit 2
 
shopt -s nullglob
found=0
for i in *.mp3; do
	echo "File $i found" # or take other action
	found=1
done
shopt -u nullglob
[ $found -eq 0 ] && echo "Directory is empty"
cd $old

如果没有nullglob,则仅当给定目录中没有文件时,我才会扩展为* .mp3。
您还可以使用GNU find命令来查找目录是否为空,即检查名为~/project/editor的目录中是否有任何* .c文件:

find ~/project/editor -maxdepth 0 -empty -exec echo {} directory is empty. \;

其中:

  • -maxdepth 0:不扫描子目录。
  • -empty:文件为空,可以是常规文件或目录。
  • -exec echo {}目录为空。 \;:如果目录为空,则显示消息。