【问题标题】:Shell script for finding (and deleting) video files if they came from a rar用于查找(和删除)来自 rar 的视频文件的 Shell 脚本
【发布时间】:2021-08-19 16:57:40
【问题描述】:

我的下载程序会自动解压缩 rar 档案,这一切都很好,因为 Sonarr 和 Radarr 需要导入原始视频文件。但是现在我的下载硬盘已经装满了我不再需要的所有这些视频文件。

我尝试过修改现有脚本,但每一步似乎都让我离目标更远。

这是我到目前为止所拥有的(这不起作用,我显然不知道我在做什么)。我的主要问题是我还无法正确找到文件。该脚本直接跳转到“未找到文件”。所以我至少做错了搜索。或者我很确定我可能需要使用我不知道的不同方法从头开始完全重写..

#!/bin/bash
# Find video files and if it came from a rar, remove it. 

# If no directory is given, work in local dir
if [ "$1" = "" ]; then
  DIR="."
else
  DIR="$1"
fi

# Find all the MKV files in this dir and its subdirs
find "$DIR" -type f -name '*.mkv' | while read filename

do

# If video file and rar file exists, delete mkv.

for f in ...
do
    if [[ -f "$DIR/*.mkv" ]] && [[ -f "$DIR/*.rar" ]]
    then
#   rm $filename
    printf "[Dry run delete]: $filename\n"
    else
    printf "No files found\n"
    exit 1
fi
done

之前和之后的目录结构示例。请注意,文件名通常与提取的文件不同。而且我想单独留下其他没有 rars 的文件夹。

之前:

/folder/moviename/Movie.that.came.from.rar.2021.dvdrip.mkv
/folder/moviename/movie.rar
/folder/moviename/movie.r00
/folder/moviename/movie.r01

/folder/moviename2/Movie.that.lives.alone.2021.dvdrip.mkv
/folder/moviename2/Movie.2021.dvdrip.nfo

之后

# (deleted the mkv only from the first folder)
/folder/moviename/movie.rar
/folder/moviename/movie.r00
/folder/moviename/movie.r01

# (this mkv survives)
/folder/moviename2/Movie.that.lives.alone.2021.dvdrip.mkv
/folder/moviename2/Movie.2021.dvdrip.nfo

TL:DR 我想要一个脚本以递归方式在我的下载驱动器中查找视频文件和 rar 文件,如果在同一个文件夹中看到两者,请删除视频文件。

【问题讨论】:

  • 你能提供更多关于“这不起作用”的细节吗?
  • 抱歉含糊不清,我修改了很多脚本并得到了不同的失败。在上面的这个例子中,它直接跳到“没有找到文件”。我相信我的主要问题是我如何做“if mkv && rar”部分可能是错误的。
  • 缺少一个done,而for f in ... 会将f 设置为字符串...,这不太可能是您想要的。你能在脚本运行前后显示一个最小的代表性目录树吗?
  • 是的,我经常为完成的数量而苦恼。在我的东西上添加了之前和之后。希望很清楚。
  • 请注意,我们需要在这里提出狭隘、具体的问题——理想的问题不是“这是我的脚本,这是它应该做的,请帮助我找出问题所在”,而是“我写一个执行 X 的脚本,但命令 Y 没有我正在寻找的效果 Z”,理想情况下使用 minimal reproducible example (当不更改运行时)测试 Y 是否在 X 的其他部分离开时执行 Z出去。这样你描述了 X 是什么,所以XY questions 可以被识别,但是人们可以只专注于如何成功修复 Y,所以它是 Z。

标签: shell rar


【解决方案1】:

使用 GNU find,您可以将其压缩为一个命令:

find "${1:-.}" -type f -name '*.rar' -execdir sh -c 'echo rm *.mkv' \;

${1:-.} 表示“使用$1,如果$1 未定义或为空,则使用.”。

对于找到的每个 .rar 文件,这会在找到的文件的目录中启动一个新的 shell(这就是 -execdir sh -c '...' 所做的)并运行 echo rm *.mkv

如果要删除的文件列表看起来正确,您实际上可以通过删除echo

find "${1:-.}" -type f -name '*.rar' -execdir sh -c 'rm *.mkv' \;

不过有两句话:

  • -execdir rm *.mkv \; 会更短,但如果当前目录中有 .mkv 文件,则 glob 可能会过早展开
  • 如果一个目录包含一个 .rar 文件,但没有 .mkv,这将尝试删除一个名为 *.mkv 的文件并导致错误消息

【讨论】:

  • 谢谢,我认为我们走在正确的轨道上。但是我得到了错误:find:paths must before expression:`​-execdir'
  • 太棒了,非常感谢,这很好用。感谢您的帮助。
猜你喜欢
  • 2014-02-19
  • 2022-07-11
  • 1970-01-01
  • 1970-01-01
  • 2015-03-03
  • 2017-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多