猿问

基于多种模式重命名文件的更好方法

我下载的许多文件的文件名中都有垃圾邮件/垃圾邮件,例如


[ www.crap.com ] file.name.ext


www.crap.com - file.name.ext


我想出了两种方法来处理它们,但它们都显得笨拙:


带有参数扩展:


if [[ ${base_name} != ${base_name//\[+([^\]])\]} ]]

then

    mv -v "${dir_name}/${base_name}" "${dir_name}/${base_name//\[+([^\]])\]}" &&

        base_name="${base_name//\[+([^\]])\]}"

fi


if [[ ${base_name} != ${base_name//www.*.com - /} ]]

then

    mv -v "${dir_name}/${base_name}" "${dir_name}/${base_name//www.*.com - /}" &&

        base_name="${base_name//www.*.com - /}"

fi


# more of these type of statements; one for each type of frequently-encountered pattern

然后用echo / sed:


tmp=`echo "${base_name}" | sed -e 's/\[[^][]*\]//g' | sed -e 's/\s-\s//g'`

mv "${base_name}" "{tmp}"

我觉得参数扩展是两者中最差的一个,但我喜欢它,因为我能够保留分配给文件的相同变量,以便在重命名后进行进一步处理(上面的代码用于为每个文件调用的脚本中)文件下载完成后)。


因此,无论如何,我希望有一种更好/更清洁的方法来执行上述操作,以使比我自己更有学识的人可以向我展示,最好以一种使我能够轻松地将旧/原始变量重新分配给新/重命名文件的方式。


谢谢


www说
浏览 476回答 3
3回答

明月笑刀无情

您可以使用rnmrnm -rs '/\[crap\]|\[spam\]//g' *.ext上面的内容将从文件名中删除[crap]或删除[spam]。您可以通过终止多个选项;或使其重载来传递多个正则表达式模式-rs。rnm -rs '/[\[\]]//g;/\s*\[crap\]//g' -rs '/crap2//' *.ext此替换字符串的一般格式为 /search_part/replace_part/modifiersearch_part:要搜索的正则表达式。replace_part:要替换为的字符串修饰符:i(不区分大小写),g(全局替换)大写小写:形式的替换字符串/search_part/\c/modifier将使文件名的选定部分(通过正则表达式search_part)变为小写,而\C替换部分中的(大写字母\ C)将使其变为大写。rnm -rs '/[abcd]/\C/g' *.ext## this will capitalize all a,b,c,d in the filenames如果您有许多需要处理的正则表达式模式,则将这些模式放入文件中,然后使用-rs/foption 传递文件。rnm -rs/f /path/to/regex/pattern/file *.ext您可以在这里找到其他示例。注意:rnm使用PCRE2(修订的PCRE)正则表达式。您可以通过运行撤消不需要的重命名操作 rnm -uPS:我是这个工具的作者。
随时随地看视频慕课网APP
我要回答