bash - 如何检查嵌套 if 是否不等于 0 bash
问题描述
我有一台 PC,它可以下载种子并将完成的文件移动到 LAN 服务器,然后继续播种它们。完成后,将删除 .parts 文件。在这一点上,我希望它将所有内容移动到正确的目录中。删除 2 个额外的 if 语句可以正常工作,但如果文件不存在,我宁愿不尝试运行命令。
我已经尝试了一些不同的方法来尽可能地压缩这个脚本,而不需要运行无用的部分。我尝试过使用以下(以及更多):
if [ "$count2" != 0 ]
if [ "$count2" -ne 0 ]
if [ "$count2" -gt 0 ]
最后的工作代码:
#!/bin/bash
count=`ls -1 *.parts 2>/var/www/html/uploads/Videos/AutoTorrents/ | wc -l`
if [ $count == 0 ]
then
mv /var/www/html/uploads/Videos/AutoTorrents/*.{mkv,mp4,m4v,avi,txt} /var/www/html/uploads/Videos/Movies/!New_Movies/
mv /var/www/html/uploads/Videos/AutoTorrents/*.{srt,sub} /var/www/html/uploads/Videos/Movies/!Subtitles/
mv /var/www/html/uploads/Videos/AutoTorrents/*.{png,jpg,jpeg} /var/www/html/images/
fi
我试图开始工作的非工作代码目前看起来像什么:
#!/bin/bash
count=$(find *.parts 2>/var/www/html/uploads/Videos/AutoTorrents/ | wc -l)
count2=$(find *.{srt,sub} 2>/var/www/html/uploads/Videos/AutoTorrents/ | wc -l)
count3=$(find *.{png,jpg,jpeg} 2>/var/www/html/uploads/Videos/AutoTorrents/ | wc -l)
if [ "$count" == 0 ]
then
mv /var/www/html/uploads/Videos/AutoTorrents/*.{mkv,mp4,m4v,avi} /var/www/html/uploads/Videos/Movies/!New_Movies/
if [ "$count2" == 0 ]
then
:
else mv /var/www/html/uploads/Videos/AutoTorrents/*.{srt,sub,txt} /var/www/html/uploads/Videos/Movies/!Subtitles/
fi
if [ "$count3" == 0 ]
then
:
else mv /var/www/html/uploads/Videos/AutoTorrents/*.{png,jpg,jpeg} /var/www/html/images/
fi
fi
解决方案
这里的问题是您的find
调用都是错误的,但是因为您正在重定向 stderr(到一个无法存储它的目录),所以您永远不会看到描述错误的错误消息,因此永远不会发现发生了什么错误的。
请考虑以下内容:
dir=/var/www/html/uploads/Videos/AutoTorrents/
count=$(find "$dir" -name '*.parts' | wc -l)
count2=$(find "$dir" '(' -name '*.srt' -o -name '*.sub' ')' -print | wc -l)
count3=$(find "$dir" '(' -name '*.png' -o -name '*.jpg' -o -name '*.jpeg' ')' -print | wc -l)
...或者,更好的是,遵循BashFAQ #4中的建议,并依靠nullglob
确保没有匹配项的 glob 扩展到空列表,并globstar
启用递归。下面还使用 GNUxargs
将文件列表拆分mv
为保证能够成功处理的长度(也依赖 GNUmv
扩展-t
将目标放在要移动的文件列表之前,而不是放在末尾):
#!/usr/bin/env bash
case $BASH_VERSION in ''|[0-3].*) echo "ERROR: Bash 4.0+ needed" >&2; exit 1;; esac
dir=/var/www/html/uploads/Videos/AutoTorrents/
movDest=/var/www/html/uploads/Videos/Movies/
imgDest=/var/www/html/images/
shopt -s nullglob globstar
parts=( "$dir"/**/*.parts )
if (( ${#parts[@]} )); then
exit 0 # do not run when any *.parts files exist
fi
movs=( "$dir"/**/*.{mkv,mp4,m4v,avi} )
if (( ${#movs[@]} )); then
printf '%s\0' "${movs[@]}" | xargs -0r mv -t "$movDest/!New_Movies" --
fi
subs=( "$dir"/**/*.{srt,sub} )
if (( ${#subs[@]} )); then
printf '%s\0' "${subs[@]}" | xargs -0r mv -t "$movDest/!Subtitles" --
fi
imgs=( "$dir"/**/*.{png,jpg,jpeg} )
if (( ${#imgs[@]} )); then
printf '%s\0' "${imgs[@]}" | xargs -0r mv -t "$imgDest" --
fi
推荐阅读
- html - 如何保持父母的风格
- c++ - 更新文件请求导致 404
- javascript - 将表 Google Script 交互式 Google Sheet 覆盖到 Google Docs,反之亦然
- python - 从列表中的每个值中提取第一个单词
- css - HTML/CSS - 居中浮动内容
- sql-server - JTDS 尝试(但失败)在应用程序启动时重新创建已经存在的表
- javascript - 使用 Xpath 修改 XML 数据的表单
- java - Java 使用扫描仪逐字读取动态日志文件
- docker - ASP.NET Core 微服务
- sql - 基于 3 个表之间的关系从 IBM DB2 查找表中提取值