如何删除没有具有不同扩展名的匹配文件的文件
How can I delete a file that doesn't have a matching file with a different extension
有点难以解释,但我正在寻找一个相对简单的 bash 脚本,如果找不到同名的 mp4 文件,它可以删除文件。
基本上我有这样的文件:
S01E02 - Name of Episode 2.description
S01E02 - Name of Episode 2.srt
S01E02 - Name of Episode 2.mp4
S01E03 - Name of Episode 3.description
S01E03 - Name of Episode 3.srt
S01E03 - Name of Episode 3.mp4
S01E04 - Name of Episode 4.description
S01E04 - Name of Episode 4.srt
我想要完成的是获得一个 bash 可以搜索文件和删除文件的脚本设置,例如:
S01E04 - Name of Episode 4.description
S01E04 - Name of Episode 4.srt
因为没有匹配的mp4文件
我大约一周前才开始玩 bash,所以我确信这比我想象的要容易得多,但我自己就是想不通。
我正在考虑使用 for 命令,但我不知道如何确定正在查看的文件是否匹配。老实说,我没有尝试太多,因为我什至想不出从哪里开始。
提前致谢!
for file in *; do
[[ $file = *.mp4 ]] && continue # skip .mp4 files
mp4_file=${file%.*}.mp4
[[ -s $mp4_file ]] || rm -f -- "$file"
done
让我们看看它是如何工作的:
${file%.*}
是一个 parameter expansion,它从变量 file
的末尾去除匹配 .*
的最短字符串。 mp4_file
因此具有无扩展名称,并附加了 .mp4
。
test -s "$mp4_file"
,或其现代 bash 语法替代方案 [[ -s $mp4_file ]]
,查看如此命名的文件是否存在且不为空。
foo || bar
执行 bar
当且仅当 foo
returns 一个布尔假值。
因此,效果是循环遍历当前目录中的文件,跳过以 .mp4
结尾的文件,查找成对或匹配的 .mp4
文件,并删除没有匹配的文件 .mp4
被发现。
你可以这样做:
#!/bin/bash
shopt -s extglob
for f in !(*.mp4)
do
filecheck=$(echo "$f" | cut -f 1 -d '.').mp4
if [ ! -f "${filecheck}" ]; then
rm -- "$filecheck"
fi
done
它只是遍历非 .mp4 文件列表并检查是否存在扩展名为 .mp4 的相同文件名
有点难以解释,但我正在寻找一个相对简单的 bash 脚本,如果找不到同名的 mp4 文件,它可以删除文件。
基本上我有这样的文件:
S01E02 - Name of Episode 2.description
S01E02 - Name of Episode 2.srt
S01E02 - Name of Episode 2.mp4
S01E03 - Name of Episode 3.description
S01E03 - Name of Episode 3.srt
S01E03 - Name of Episode 3.mp4
S01E04 - Name of Episode 4.description
S01E04 - Name of Episode 4.srt
我想要完成的是获得一个 bash 可以搜索文件和删除文件的脚本设置,例如:
S01E04 - Name of Episode 4.description
S01E04 - Name of Episode 4.srt
因为没有匹配的mp4文件
我大约一周前才开始玩 bash,所以我确信这比我想象的要容易得多,但我自己就是想不通。
我正在考虑使用 for 命令,但我不知道如何确定正在查看的文件是否匹配。老实说,我没有尝试太多,因为我什至想不出从哪里开始。
提前致谢!
for file in *; do
[[ $file = *.mp4 ]] && continue # skip .mp4 files
mp4_file=${file%.*}.mp4
[[ -s $mp4_file ]] || rm -f -- "$file"
done
让我们看看它是如何工作的:
${file%.*}
是一个 parameter expansion,它从变量file
的末尾去除匹配.*
的最短字符串。mp4_file
因此具有无扩展名称,并附加了.mp4
。test -s "$mp4_file"
,或其现代 bash 语法替代方案[[ -s $mp4_file ]]
,查看如此命名的文件是否存在且不为空。foo || bar
执行bar
当且仅当foo
returns 一个布尔假值。
因此,效果是循环遍历当前目录中的文件,跳过以 .mp4
结尾的文件,查找成对或匹配的 .mp4
文件,并删除没有匹配的文件 .mp4
被发现。
你可以这样做:
#!/bin/bash
shopt -s extglob
for f in !(*.mp4)
do
filecheck=$(echo "$f" | cut -f 1 -d '.').mp4
if [ ! -f "${filecheck}" ]; then
rm -- "$filecheck"
fi
done
它只是遍历非 .mp4 文件列表并检查是否存在扩展名为 .mp4 的相同文件名