重命名脚本以调整 debian 文件名中的某些模式
rename script to adjust certain patterns within a filename in debian
我目前有点卡住了,尝试调整文件夹树中的文件名,如果它们具有以下一项或两项:
删除 'S00' - 'S99' - 那部分要从文件名中删除。
s/[sS](0[1-9]|[1-9][0-9])/
我认为可以做到这一点
任何独立的两位数前面都有一个 'E'。找到 /\b([0-9]{2})\b/
并以某种方式替换 E
示例:
这些中的任何一个
[lorem ipsum] 悲伤坐下 07 [consetetur][1080p].mkv
[lorem ipsum] 悲伤坐着 amet S04 07 [consetetur][1080p].mkv
[lorem ipsum] 悲伤坐下 S04 E07 [consetetur][1080p].mkv
改为
- [lorem ipsum] 悲伤坐下 E07 [consetetur][1080p].mkv
在各自的子文件夹中。
最终目标是在文件出现时自动执行重命名文件的过程(完成后我必须弄清楚后一点)以便 kodi scraper 可以识别剧集
这就是我的进展,如你所见,它仍然是一团糟,因为我刚才在这里找到了这个重命名脚本,但我不知道如何正确应用正则表达式,我只是打了个耳光它在
#!/bin/bash
start_dir="//srv/MEDIA2/"
find "$start_dir" -name '*.*' -type f \
|sort \
|while read name; do
((i++))
mv -i "$name" \
#remove season part
"$(printf 's/[sS](0[1-9]|[1-9][0-9])/' "$(dirname "$name")" $((i)) "$(basename "$name")")"
#prepend E to free standing double digits
"$(printf 's/\b([0-9]{2})\b/' "$(dirname "$name")" $((i)) "$(basename "$name")")"
done
目前returns
//home/user/./rnscript.sh: line 14: s/[sS](0[1-9]|[1-9][0-9])/: No such file or directory
//home/user/./rnscript.sh: line 16: s([0-9]{2}/: No such file or directory
如果在该领域有专业知识的人可以帮助我得到这个 运行,将不胜感激。
请您尝试以下操作:
#!/bin/bash
shopt -s globstar
start_dir="//srv/MEDIA2/" # double // may be meaningless
for name in "$start_dir"/**/*.*; do # search the directory recursively
[[ -f $name ]] || continue # skip if "$name" is not a file
newname=$(sed -E 's/[sS](0[1-9]|[1-9][0-9]) +//; s/\b([0-9]{2})\b/E/' <<< "$name")
if [[ "$name" != "$newname" ]]; then # skip if the filenames are the same
echo mv -- "$name" "$newname"
fi
done
如果输出看起来不错,请删除 echo
。
我们不必对文件进行排序,因为未使用变量 $i
。
[编辑]
如果您也想将 S04E02
更改为 E02
,请将上面的 newname=
行替换为:
newname=$(sed -E 's/[sS](0[1-9]|[1-9][0-9]) *//; s/\b([0-9]{2})\b/E/' <<< "$name")
不同之处只是将 +
更改为 *
,即零个或多个空格。
我目前有点卡住了,尝试调整文件夹树中的文件名,如果它们具有以下一项或两项:
删除 'S00' - 'S99' - 那部分要从文件名中删除。
s/[sS](0[1-9]|[1-9][0-9])/
我认为可以做到这一点任何独立的两位数前面都有一个 'E'。找到
/\b([0-9]{2})\b/
并以某种方式替换E
示例: 这些中的任何一个
[lorem ipsum] 悲伤坐下 07 [consetetur][1080p].mkv
[lorem ipsum] 悲伤坐着 amet S04 07 [consetetur][1080p].mkv
[lorem ipsum] 悲伤坐下 S04 E07 [consetetur][1080p].mkv
改为
- [lorem ipsum] 悲伤坐下 E07 [consetetur][1080p].mkv
在各自的子文件夹中。
最终目标是在文件出现时自动执行重命名文件的过程(完成后我必须弄清楚后一点)以便 kodi scraper 可以识别剧集
这就是我的进展,如你所见,它仍然是一团糟,因为我刚才在这里找到了这个重命名脚本,但我不知道如何正确应用正则表达式,我只是打了个耳光它在
#!/bin/bash
start_dir="//srv/MEDIA2/"
find "$start_dir" -name '*.*' -type f \
|sort \
|while read name; do
((i++))
mv -i "$name" \
#remove season part
"$(printf 's/[sS](0[1-9]|[1-9][0-9])/' "$(dirname "$name")" $((i)) "$(basename "$name")")"
#prepend E to free standing double digits
"$(printf 's/\b([0-9]{2})\b/' "$(dirname "$name")" $((i)) "$(basename "$name")")"
done
目前returns
//home/user/./rnscript.sh: line 14: s/[sS](0[1-9]|[1-9][0-9])/: No such file or directory
//home/user/./rnscript.sh: line 16: s([0-9]{2}/: No such file or directory
如果在该领域有专业知识的人可以帮助我得到这个 运行,将不胜感激。
请您尝试以下操作:
#!/bin/bash
shopt -s globstar
start_dir="//srv/MEDIA2/" # double // may be meaningless
for name in "$start_dir"/**/*.*; do # search the directory recursively
[[ -f $name ]] || continue # skip if "$name" is not a file
newname=$(sed -E 's/[sS](0[1-9]|[1-9][0-9]) +//; s/\b([0-9]{2})\b/E/' <<< "$name")
if [[ "$name" != "$newname" ]]; then # skip if the filenames are the same
echo mv -- "$name" "$newname"
fi
done
如果输出看起来不错,请删除 echo
。
我们不必对文件进行排序,因为未使用变量 $i
。
[编辑]
如果您也想将 S04E02
更改为 E02
,请将上面的 newname=
行替换为:
newname=$(sed -E 's/[sS](0[1-9]|[1-9][0-9]) *//; s/\b([0-9]{2})\b/E/' <<< "$name")
不同之处只是将 +
更改为 *
,即零个或多个空格。