首页 > 解决方案 > 将 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 

标签: bash

解决方案


是好习惯吗?

未加$DIR$SUB_DIR引号,因此会进行分词和文件名扩展。使用 shellcheck.net 检查您的脚本以发现此类错误。

不要禁用错误 -2>/dev/null它们可能会向用户提供失败的各种提示 - 权限被拒绝、目录不存在等。

不要将大写变量用于局部变量。更喜欢使用小写的变量。

也许有一种更安全/更好的方法来做这样的事情?

检查find退出状态。

删除-depth. 为什么要使用它?

不是打印整个文件名,而是打印一个点。或者只是任何东西。它将比文件名短,因此将使用更少的内存。

if tmp="$(find "$dir/$sub_dir" ... -print . -quit)" && [[ -n "$tmp" ]]; then

并且,另请参阅测试 glob 在 bash 中是否有任何匹配项


推荐阅读