如何检查嵌套是否不等于0 bash

时间:2019-04-28 18:25:04

标签: 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

1 个答案:

答案 0 :(得分:2)

这里的问题是您的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启用递归。下面还使用GNU xargs将文件列表拆分为长度mv,确保能够成功处理(也依赖于GNU mv扩展名-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