Shell 用于查找(和删除)来自 rar 的视频文件的脚本
Shell script for finding (and deleting) video files if they came from a rar
我的下载程序会自动解压缩 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 [ "" = "" ]; then
DIR="."
else
DIR=""
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
之前和之后的目录结构示例。请注意,文件名通常与提取的文件不同。我想单独留下其他没有 ras 的文件夹。
之前:
/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 文件,如果它在同一文件夹中看到这两个文件,则删除视频文件。
使用 GNU find,您可以将其压缩为一个命令:
find "${1:-.}" -type f -name '*.rar' -execdir sh -c 'echo rm *.mkv' \;
${1:-.}
表示“如果 </code> 未定义或为空,则使用 <code>
或 .
”。
对于找到的每个 .rar
文件,这会在找到的文件的目录中启动一个新的 shell(这就是 -execdir sh -c '...'
所做的)并运行 echo rm *.mkv
。 =25=]
如果要删除的文件列表看起来正确,您实际上可以通过删除 echo
:
来删除它们
find "${1:-.}" -type f -name '*.rar' -execdir sh -c 'rm *.mkv' \;
不过有两点说明:
-execdir rm *.mkv \;
会更短,但如果当前目录中有 .mkv
个文件 ,则 glob 可能会过早扩展
- 如果一个目录包含一个 .
rar
文件,但没有 .mkv
,这将尝试删除一个名为 *.mkv
的文件并导致错误消息
我的下载程序会自动解压缩 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 [ "" = "" ]; then
DIR="."
else
DIR=""
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
之前和之后的目录结构示例。请注意,文件名通常与提取的文件不同。我想单独留下其他没有 ras 的文件夹。
之前:
/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 文件,如果它在同一文件夹中看到这两个文件,则删除视频文件。
使用 GNU find,您可以将其压缩为一个命令:
find "${1:-.}" -type f -name '*.rar' -execdir sh -c 'echo rm *.mkv' \;
${1:-.}
表示“如果 </code> 未定义或为空,则使用 <code>
或 .
”。
对于找到的每个 .rar
文件,这会在找到的文件的目录中启动一个新的 shell(这就是 -execdir sh -c '...'
所做的)并运行 echo rm *.mkv
。 =25=]
如果要删除的文件列表看起来正确,您实际上可以通过删除 echo
:
find "${1:-.}" -type f -name '*.rar' -execdir sh -c 'rm *.mkv' \;
不过有两点说明:
-execdir rm *.mkv \;
会更短,但如果当前目录中有.mkv
个文件 ,则 glob 可能会过早扩展
- 如果一个目录包含一个 .
rar
文件,但没有.mkv
,这将尝试删除一个名为*.mkv
的文件并导致错误消息