如何检查find命令是否找不到任何东西(bash,openSUSE)?

时间:2014-08-06 09:36:10

标签: linux bash find suse

我知道可以像查找

那样使用for循环
for i in `find $something`; do (...) done

但是我想在"如果"。

中使用find命令

我正在尝试通过我的脚本创建有关已删除文件的进度注释(以及稍后的日志文件)。我需要检查是否

find /directory/whatever -name '*.tar.gz' -mtime +$DAYS

发现了什么与否。如果不是,我想说回声'你没有超过$ DAYS天的文件'或类似的东西;)

我如何在shell脚本中执行此操作?

6 个答案:

答案 0 :(得分:10)

你想使用查找命令 如果条件,你可以试试这个内容:

 [[ ! -z `find 'YOUR_DIR/' -name 'something'` ]] && echo "found" || echo "not found"

使用示例:

 [prompt] $ mkdir -p Dir/dir1 Dir/dir2/ Dir/dir3                 
 [prompt] $ ls Dir/
 dir1  dir2  dir3
 [prompt] $ [[ ! -z `find 'Dir/' -name 'something'` ]] && echo "found" || echo "not found"
 not found
 [prompt] $ touch Dir/dir3/something
 [prompt] $ [[ ! -z `find 'Dir/' -name 'something'` ]] && echo "found" || echo "not found"
 found

答案 1 :(得分:9)

计算输出的行数并将其存储在变量中,然后测试它:

lines=$(find ... | wc -l)
if [ $lines -eq 0 ]; then
...
fi

答案 2 :(得分:4)

退出0很容易找到,退出> 0更难,因为通常只会发生 有错误。但是我们可以实现它:

if find -type f -exec false {} +
then
  echo 'nothing found'
else
  echo 'something found'
fi

答案 3 :(得分:3)

如果可能,我想在一行中执行此操作,但无法找到一种方法来查找更改其退出代码而不会导致错误。

但是,根据您的具体要求,以下内容应该有效:

find /directory/whatever -name '*.tar.gz' -mtime +$DAYS | grep 'tar.gz' || echo "You don't have files older than $DAYS days"

这可以通过将find的输出传递给grep来实现相同的功能,如果它没有找到任何内容则返回失败退出代码,或者如果成功则返回找到的行。

||之后的所有内容只有在前面的命令失败时才会执行。

答案 4 :(得分:1)

这对我有用

if test $(find . -name "pattern" | wc -c) -eq 0
then
    echo "missing file with name pattern"
fi

答案 5 :(得分:0)

如果您的文件名包含空格,则迭代find的输出可能会很危险。如果你确定他们没有,你可以将find的结果存储到数组中,并检查其大小以查看是否有任何匹配:

results=( $(find -name "$something") )
if (( ${#results[@]} )) ; then
    echo Found
else
    echo Not found
fi
for file in "${results[@]}" ; do
   # ...
done