在 shell 脚本中使用 '*'

在 shell 脚本中使用 '*'

我正在尝试运行一个命令示例:

sudo mv /home/vaishnavi/Downloads/*.ttc /home/vaishnavi/Downloads/*.ttf /usr/local/share/fonts/ms_fonts/

它在终端上运行良好,但是当我尝试在 shell 脚本中添加它时(.sh)出现错误:

mv: cannot stat '/home/vaishnavi/Downloads/*.ttf': No such file or directory

简单来说,我想将所有文件.ttf.ttc类型移动到/usr/local/share/fonts/ms_fonts/。坦率地说,我对 shell 脚本不太熟悉。请向我解释我做错了什么,以及实现我预期结果的替代方法。

我的示例脚本:

sudo mv /home/vaishnavi/Downloads/*.ttc /home/vaishnavi/Downloads/*.ttf /usr/local/share/fonts/ms_fonts/  
...

exit 0

答案1

如果那里没有 *.ttf 文件,您将收到此错误。默认情况下,如果没有文件与 glob 模式匹配,则模式本身将保留在命令中。使用 bash nullglobshell 选项关闭此功能

为了更安全一点,请验证确实有一些文件需要移动:

#!/usr/bin/env bash
...
shopt -s nullglob
# store files in an array
files=( /home/vaishnavi/Downloads/*.{ttc,ttf} )
# and if the array is not empty, move the files.
if (( ${#files[@]} > 0 )); then
    sudo mv -t /usr/local/share/fonts/ms_fonts/ "${files[@]}" 
fi

相关内容