2015-11-07 138 views
1

我已经编写了一个shell脚本,它基本上查找了rar文件并将它们取消。检查一个文件是否存在于一个给定的目录中,而不是子目录

为了避免多次解开同一个文件,我添加了一个我将要解析的文件类型的检查,即* .avi,* .mkv和* .mp4。

find "/mnt/media1/TV Shows/" -type f -name "*.rar" -print0 | while IFS= read -r -d '' file; do 
    DIR=$(dirname "${file}") 
    MKV=$(find "${DIR}" -name "*.mkv" -print0) 
    AVI=$(find "${DIR}" -name "*.avi" -print0) 
    MP4=$(find "${DIR}" -name "*.mp4" -print0) 
    if [ ! -f "$MKV" ] && [ ! -f "$AVI" ] && [ ! -f "$MP4" ]; then 
      printf "UNRARING ${DIR}\n" >> /home/johan/unrarer.log 
      sudo unrar e "${file}" 
      MKV=$(find "${DIR}" -name "*.mkv" -print0) 
      AVI=$(find "${DIR}" -name "*.avi" -print0) 
      MP4=$(find "${DIR}" -name "*.mp4" -print0) 
      if [ ! -f "$MKV" ] && [ ! -f "$AVI" ] && [ ! -f "$MP4" ]; then 
        printf "UNRAR FAILED\n" >> /home/johan/unrarer.log 
      else 
        printf "UNRAR SUCCESSFUL\n" >> /home/johan/unrarer.log 
      fi 
    else 
      printf "${DIR}: Found an mkv, avi or mp4 file, skipping\n" >> /home/johan/unrarer.log 
    fi 
done 

现在的问题是,大多数,如果不是全部,目录有在它的视频文件中的“样本”子目录中。这个文件被标记为我当前的实现,这不是我的愿望。

我希望它在确切的目录,$DIR,而不是它的任何子目录。

目前我已经做了一个解决方法,我只是简单地删除示例目录,如果它存在,但这打破了山洪。

我尝试过试验一下-wholename,但我还没有找到任何可行的方法。

任何帮助表示赞赏。

问候, 约翰

+1

检查“发现”您的系统上的联机帮助 - 雷说: :“-maxdepth levels |在命令行参数下的大多数目录级别(非负整数)级别下降-maxdepth 0表示仅将测试和操作应用于命令行参数。” –

回答

2

使用-maxdepth选项限制查找到当前目录。

MKV=$(find "${DIR}" -name "*.mkv" -print0 -maxdepth 0) 
AVI=$(find "${DIR}" -name "*.avi" -print0 -maxdepth 0) 
MP4=$(find "${DIR}" -name "*.mp4" -print0 -maxdepth 0) 
2

charlton_austin的答案举行了答案。然而这是-maxdepth 1

完整的脚本:

find "/mnt/media1/TV Shows/" -type f -name "*.rar" -print0 | while IFS= read -r -d '' file; do 
    DIR=$(dirname "${file}") 
    cd "${DIR}" 
    MKV=$(find . -maxdepth 1 -name "*.mkv" -print0) 
    AVI=$(find . -maxdepth 1 -name "*.avi" -print0) 
    MP4=$(find . -maxdepth 1 -name "*.mp4" -print0) 
    if [ ! -f "$MKV" ] && [ ! -f "$AVI" ] && [ ! -f "$MP4" ]; then 
      printf "UNRARING ${DIR}\n" >> /home/johan/unrarer.log 
      sudo unrar e "${file}" 
      MKV=$(find . -maxdepth 1 -name "*.mkv" -print0) 
      AVI=$(find . -maxdepth 1 -name "*.avi" -print0) 
      MP4=$(find . -maxdepth 1 -name "*.mp4" -print0) 
      if [ ! -f "$MKV" ] && [ ! -f "$AVI" ] && [ ! -f "$MP4" ]; then 
        printf "UNRAR FAILED\n" >> /home/johan/unrarer.log 
      else 
        printf "UNRAR SUCCESSFUL\n" >> /home/johan/unrarer.log 
      fi 
    else 
      printf "${DIR}: Found an mkv, avi or mp4 file, skipping\n" >> /home/johan/unrarer.log 
    fi 
done 
0

您可以通配的进步:

if [[ "$(ls ./*.{mkv,avi,mp4} 2> /dev/null)" != "" ]]; then 
    echo "exists" 
else 
    echo "fail" 
fi 
0

find在这里没有必要的,因为你只是在寻找与文件指定目录中给定的扩展名。只需使用该模式填充数组。它似乎并不需要保持不同类型的文件分开;你只是检查东西被取消存档。

cd "$DIR" 
files=("$DIR"/*.mkv "$DIR"/*.avi "$DIR"/*.mp4) 
if ((${#files[@]} == 0)); then 
    printf "UNRARING $DIR\n" >> /home/johan/unrarer.log 
    sudo unrar e "$file" 
    files=("$DIR"/*.mkv "$DIR"/*.avi "$DIR"/*.mp4) 
    if ((${#files[@]} == 0)); then 
     printf "UNRAR FAILED\n" >> /home/johan/unrarer.log 
    else 
     printf "UNRAR SUCCESSFUL\n" >> /home/johan/unrarer.log 
    fi 
else 
    printf "$DIR: Found an mov, avi, or mp4 file, skipping\n" >> /home/johan/unrarer.log 
fi 

如果您正在使用bash 4或更高版本,则不需要使用find找到RAR文件之一:

shopt -s globstar 
for file in "/mnt/media1/TV Shows/"**/*.rar; do 
    ... 
done 
相关问题