bash - 将 FIND 命令与 IF 语句结合使用
问题描述
我想知道,如果我将查找文件名或“文件类型”与 if 语句结合使用的解决方案是好的做法?也许有一种更安全/更好的方法来做这样的事情?
#!/usr/bin/env bash
DIR="/home/user"
SUB_DIR="/Downloads"
if [[ -n "$(find $DIR$SUB_DIR -depth -type f -name '*.jpg' -print0 -quit 2>/dev/null)" ]]; then
echo "Found JPG-File"
elif [[ -n "$(find $DIR$SUB_DIR -depth -type f -name '*.png' -print0 -quit 2>/dev/null)" ]]; then
echo "Found PNG-File"
#... and much more elif statements
fi
-print0
- 如果文件名中有空格
-quit
- 先捕获然后退出查找命令
我还使用这行代码从搜索中排除子文件夹:
if [[ -n "$(find $DIR$SUB_DIR -type d \( -path */RAW* -o -path */VIDEO* \) -prune -o -type f -name '*.jpg' -print0 -quit 2>/dev/null)" ]]; then
echo "Some other stuff"
fi
解决方案
是好习惯吗?
未加$DIR$SUB_DIR
引号,因此会进行分词和文件名扩展。使用 shellcheck.net 检查您的脚本以发现此类错误。
不要禁用错误 -2>/dev/null
它们可能会向用户提供失败的各种提示 - 权限被拒绝、目录不存在等。
不要将大写变量用于局部变量。更喜欢使用小写的变量。
也许有一种更安全/更好的方法来做这样的事情?
检查find
退出状态。
删除-depth
. 为什么要使用它?
不是打印整个文件名,而是打印一个点。或者只是任何东西。它将比文件名短,因此将使用更少的内存。
if tmp="$(find "$dir/$sub_dir" ... -print . -quit)" && [[ -n "$tmp" ]]; then
并且,另请参阅测试 glob 在 bash 中是否有任何匹配项。
推荐阅读
- redirect - 在 GitHub Pages 上重定向多个网页
- python - RASA 槽提取 NLU 数据
- android - BLE - clientIf 值大于 7 时的连接问题
- html - 选择的选项标签可以使用 django 携带多个值吗?
- android - Chrome devTools 检测到远程设备但未检测到活动的 Chrome 选项卡并且不提供链接
- python-3.x - 为什么我的循环变量不转换为字符串?
- ruby-on-rails - Rails 使用 devise 登录以从两个数据库表进行身份验证
- regex - 有没有办法创建一个正则表达式函数,我可以忽略正斜杠并删除正斜杠之后的第一个单词?
- python - 如何查找数据ID最高的标题和列表
- html - 带有http标头的HTML 5视频播放?