我知道可以像查找
那样使用for循环for i in `find $something`; do (...) done
但是我想在"如果"。
中使用find命令我正在尝试通过我的脚本创建有关已删除文件的进度注释(以及稍后的日志文件)。我需要检查是否
find /directory/whatever -name '*.tar.gz' -mtime +$DAYS
发现了什么与否。如果不是,我想说回声'你没有超过$ DAYS天的文件'或类似的东西;)
我如何在shell脚本中执行此操作?
答案 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